移除掉 -ObjC? 親測可用? 但是 .a文件在編譯的時候鏈接不上 這類問題是重復(fù)引起的 只要看xcode給的錯誤信息挨個刪就可以了
Try remove the "-ObjC" linker flag from the "Other Linker Flags" section of build settings.
乐设、、绎巨、近尚、、场勤、戈锻、歼跟、、格遭、哈街、、拒迅、骚秦、、璧微、作箍、、前硫、胞得、、开瞭、懒震、、嗤详、、瓷炮、葱色、、娘香、苍狰、、烘绽、淋昭、、安接、翔忽、、盏檐、歇式、、胡野、材失、、硫豆、龙巨、笼呆、、旨别、诗赌、、
遇到引用庫重復(fù)定義的問題昼榛,需要解決境肾。
項(xiàng)目需要,同時引用ZBar和QQ授權(quán)登錄SDK胆屿,由于二者均使用了Base64處理數(shù)據(jù)奥喻,XCode編譯時報錯:
duplicate symbol _base64_encodein:
...\libzbar.a(symbol.o)
...\TencentOpenAPI(base64.o)
意思就是在這兩個庫中都定義了_base64_encode,編譯器認(rèn)為你重復(fù)定義了非迹。至于為什么編譯器認(rèn)為重復(fù)定義环鲤,個人認(rèn)為編譯器編譯全局變量時會根據(jù)名字進(jìn)行編譯,會把相同名稱的全局變量編譯為相同變量憎兽,也就是多個編譯成一個冷离,而編譯器認(rèn)為這樣可能會引起錯誤,就提醒用戶這里有錯纯命。
解決方案:
參考了:http://blog.sina.com.cn/s/blog_4beb28f301012bl6.html
刪掉了setbuilding->other linker flag-> -all_load
iOS的Framework是共享動態(tài)庫西剥,不會被打包到app中,非系統(tǒng)Framework靜態(tài)庫都會被打包到app中亿汞,所以會產(chǎn)生"Duplicate Symbol"的錯誤瞭空。
在Build Settings->Other link flags中刪除所有的-all_load與-force_load, XCode會很smart的去掉"Duplicate Symbol"。
以下是從外國友人那獲取的終極解決策略疗我,方案是修改類庫:
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.
假設(shè)有兩個三方類庫僅提供給你了.a文件咆畏,沒有源碼,你可以通過libtool, lipo和ar在terminal中解壓合并他們吴裤。
To see what architectures areinthe file:
查看文件都支持了什么架構(gòu)
$ lipo -info libTapjoy.a
Architecturesinthe fat file: libTapjoy.a are: armv6 i386
Then to extract just armv6,forexample:
然后只解壓armv6旧找,例如
$ 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:
你可以從另一個類庫中解壓同樣架構(gòu)的部分,然后將兩者合并在一起
$ libtool -static-o ../lib-armv6.a *.o
And thenfinally, after you've done this with each architecture, you can combine them again with lipo:
如上所示麦牺,你可以將所有架構(gòu)都按照這個流程走一遍钮蛛,然后合并
$ cd ..
$ lipo -create -output lib.a lib-armv6.a lib-i386.a
This shouldgetrid 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.
這個過程不僅解決掉了duplicate symbols的問題,也將兩個類庫合并為一個枕面。如果你想分別保存兩個類庫愿卒,你可以將duplicate的部分從任意一個類庫中刪除,你可以相應(yīng)的修改這個過程潮秘。