20

Few days ago i create static-library (Universal) that work's fine with Xcode5.0 SDK7. After Update Xcode5.1 with SDK7.1 that not work if i select simulator iPhone Retina(4-inch 64-bit). Then i am going to update my lib with Bellow setting change.

enter image description here

I do the same for three Target:-

enter image description here

For sporting simulator as well as device i put Universal lib and in to this i run script this:- enter image description here

After this i Build Again lib and used as i done Before in to my project. But still getting same issue with iPhone Retina(4-inch 64-bit) Undefined symbols for architecture x86_64:


So, My question is that is there any additional change required for updating lib for or i did any mistake in above step. Please current me if i am wrong.

what change needed for update my static-library for supporting 64Bit architecture

NOTE:

I am asking for my own created Library Update. i am not using third-party Library. Update

I used this lipo -info testingLibImport/libLibNSlog.a command in to my Terminal that output is:

Architectures in the fat file: testingLibImport/libLibNSlog.a are: armv7 armv7s i386 arm64 
Nitin Gohel
  • 49,482
  • 17
  • 105
  • 144
  • http://stackoverflow.com/questions/20234623/parse-error-iphone-retina-4-inch-64bit and http://stackoverflow.com/questions/20264574/missing-required-architecture-x86-64-in-file-libcoreplot-cocoatouch-a might be helpful in your case – iPatel Mar 13 '14 at 10:25
  • see this http://stackoverflow.com/questions/22331908/xcode-5-1-missing-required-architecture-arm64/22370729#22370729 – Mani Mar 13 '14 at 10:29
  • please see in my question i already done this change but got same error. – Nitin Gohel Mar 13 '14 at 10:30
  • 1
    before duplication vote this question about my own created Lib inundation not for other. i want to Know how to update my lib. – Nitin Gohel Mar 13 '14 at 10:34
  • Be sure to cleanup your derived data before declaring your new build not working – Jim75 Mar 18 '16 at 16:39

4 Answers4

14

Another solution I found with XCode 6.4 is to add ONLY_ACTIVE_ARCH=NO and not specify the architecture. So

xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

Will build i386 and x86_64 architectures in your library.


Here's my full universal lib run script to build all the architectures.

# define output folder environment variable
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

# Step 1. Build Device and Simulator versions
xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"

# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"

# Step 2. Create universal binary file using lipo
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a"                "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"

# Last touch. copy the header files. Just for convenience
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"
dwxw
  • 1,089
  • 1
  • 10
  • 17
  • Thanks a lot. Exactly what I wanted. – atulkhatri Nov 21 '16 at 16:51
  • @dwxw when i use above script with xcode 10 it gives me an error: accessing build database "/Users/mystaticLib/build/XCBuildData/build.db": database is locked Possibly there are two concurrent builds running in the same filesystem location. – Satish Mavani Nov 01 '18 at 12:08
  • for more detail pls check this: https://stackoverflow.com/questions/53041772/is-there-any-change-with-ios-static-library-run-script-with-xcode-10 – Satish Mavani Nov 01 '18 at 12:09
10

I too ran into the same problem yesterday and after lot of googling and trying on different solutions, i gave up and tried on my own. All i could understand from the different solutions provided was that when i run "lipo -info library.a" it was not built for x86_64 architecture. So, decided to give up the aggregate approach and made a simple attempt.

  1. as advised in this post, i added armv7, armv7s and arm64 to the architectures.
  2. build the static library project with iphone simulator (32 bit)
  3. build the static library project with iphone simulator (64 bit)
  4. build the static library project with iOS device
  5. go to the build path (under derived data)
  6. copied both simulator and device output to a common folder
  7. used lipo command in terminal window to create the universal library

lipo command: lipo -create -output newlibraryname.a simulatorlibraryname.a devicelibraryname.a

integrated the newly created universal static library and it WORKED!!!

Deepak Badiger
  • 448
  • 7
  • 18
  • 1
    After wasting hours trying to get Xcode to compile into a universal binary, this "big hammer" approach did the job. Only wish I had tried it sooner. Thanks! – picciano Dec 12 '14 at 17:25
9

After lots of stuff i got solution. some of xcode dont know there is automatic appear Standard architectures (including 64-bit) (armv7,armv7s,arm64) but in my case there is not option into my Static Library Project. so i am going to add this Manually like:-

enter image description here

and select this Option:-

enter image description here

After this i re-Build My static Library and used in to in my project that working fine now. and I also checked with lipo command in to terminal that output going to different now:-

testingLibImport/libLibNSlog.a are: armv7 armv7s i386 x86_64 arm64

Community
  • 1
  • 1
Nitin Gohel
  • 49,482
  • 17
  • 105
  • 144
4

Sorry for posting another solution so late. I had found this solution long time back when i was trying to find a solution that would save me from the manual work of creating a universal library using lipo command every time i had to build the universal library.

So, here is the another approach, for those using aggregate approach to build the universal library

just make one small change as mentioned below in your aggregate script for simulator to build the universal library -

xcodebuild -target ProductName -configuration ${CONFIGURATION} -sdk iphonesimulator ARCHS="i386 x86_64" BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"

Please observe the inclusion of multiple architectures instead of using single architecture approach -

xcodebuild -target ProductName -configuration ${CONFIGURATION} -sdk iphonesimulator -arch i386 BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"

Just ARCHS="i386 x86_64" will do the magic for you.

You can confirm this by using the following lipo command lipo -info newLibraryName.a

Hope this saves time for many others like me!!!

Deepak Badiger
  • 448
  • 7
  • 18