views:

168

answers:

2

I have two 3rd party libraries that seem to use the same class. That should be fine but I'm getting this type of error when building:

ld: duplicate symbol .objc_class_name_CJSONScanner in /Users/myappOne/TapjoyConnect/Frameworks/libTapjoyConnectSimulatorRewardInstall_Ads_Pinch.a(CJSONScanner.o) and /Developer/Projects/BuildOutput/Debug-iphonesimulator/OtherLibrary_d.a(CJSONScanner.o)

How can I handle this issue...

-- EDIT --

...if the source files are not available?

A: 

If you have the sources to both static libraries, build one of them without the CJSONScanner class. If you don't you can use "ar" from the command line to extract the CJSONScanner.o from one of the libraries.

There's probably some magic flag you can pass to "ld" to fix this, but I don't know it off hand.

Mark Bessey
What does "ar" mean?
Simply, `ar` is the name of a command-line tool. If you type `man ar`, you'll see detailed information, including a description of functionality: "create and maintain library archives". The `-x` option is for extract, but it seems you'd want `-d` to delete instead.
Quinn Taylor
Most likely these are fat files and `ar` alone will not be sufficient. He'll also need `lipo` and `libtool` to do this.
Cory Kilger
Thanks. What do you mean by a fat file?
A fat file contains multiple architectures. That way you can have a single file and have it run both on the simulator and the device.
Cory Kilger
+5  A: 

I'm going to assume that these are two third party libraries that have only provided you with the .a files and not the source code. You can use libtool, lipo and ar on the terminal to extract and recombine the files.

To see what architectures are in the file:

$ lipo -info libTapjoy.a
Architectures in the fat file: libTapjoy.a are: armv6 i386

Then to extract just armv6, for example:

$ lipo -extract_family armv6 -output libTapjoy-armv6.a libTapjoy.a
$ mkdir armv6
$ cd armv6
$ ar -x ../libTapjoy-armv6.a

You can then extract the same architecture from the other library into the same directory and then recombine them like so:

$ libtool -static -o ../lib-armv6.a *.o

And then finally, after you've done this with each architecture, you can combine them again with lipo:

$ cd ..
$ lipo -create -output lib.a lib-armv6.a lib-i386.a

This should get rid of any duplicate symbols, but will also combine the two libraries into one. If you want to keep them separate, or just delete the duplicate from one library, you can modify the process accordingly.

Cory Kilger
So, does this mean my project should only reference lib.a and not the other two library files?
If you were to do exactly as I did it, then yes, you would remove the other two files and use the new one.
Cory Kilger