2010-05-26 19 views
14

Aynı sınıfı kullanan iki üçüncü taraf kitaplığım var. Bu iyi olmalı ama oluştururken ben Bu tür hataları alıyorum: Ben bu sorunu halledebiliriz nasıl3. taraf kitaplıklarındaki yinelenen sembol hatası nasıl ele alınır?

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) 

...

- DÜZENLEME -

eğer ... kaynak dosyaları mevcut değil mi? Eğer statik kütüphaneler hem kaynağınız varsa

cevap

0

, CJSONScanner sınıfının olmadan bunlardan birini kurmak. Eğer yapmazsanız, CJSONScanner.o'yu kütüphanelerden birinden çıkarmak için komut satırından "ar" kullanabilirsiniz.

muhtemelen bu sorunu gidermek için "ld" için geçebilir bazı sihirli bayrak var, ama elini onu bilmiyorum.

+0

"ar" ne anlama geliyor? – user230949

+0

Basitçe, 'ar' bir komut satırı aracının adıdır. Eğer 'erkek ar' yazarsanız, işlevsellik açıklaması da dahil olmak üzere ayrıntılı bilgileri göreceksiniz: "kütüphane arşivleri oluşturma ve koruma". '-x' seçeneği ayıklamak içindir, ancak bunun yerine' -d '' yi silmek isteyeceksiniz. –

+0

Büyük olasılıkla bunlar yağ dosyaları ve 'ar' tek başına yeterli olmayacaktır. Bunu yapmak için lipo ve libtool'a da ihtiyacı olacak. –

31

Bunları sadece .a dosya ve olmayan kaynak kodu ile sağladı iki üçüncü parti kütüphaneler olduğunu varsaymak gidiyorum. Dosyaları ayıklamak ve yeniden birleştirmek için libtool, lipo ve ar terminalini kullanabilirsiniz.

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

Daha sonra aynı içine diğer kütüphaneden aynı mimariyi çıkarabilir: örneğin, Sonra

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

sadece ARMv6 ayıklamak için:

dosyada ne mimariler görmek için dizini ekleyin ve sonra bunları şu şekilde yeniden birleştirin:

Ve son olarak, af

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

Bu

herhangi bir yinelenen sembollerin kurtulmak gerekir, ama aynı zamanda içine bir iki kitaplıkları birleştirecek: Her mimarisi ile yaptık ter, sen lipo ile tekrar birleştirebilirsiniz. Bunları ayrı tutmak ya da sadece bir kütüphaneden kopyayı silmek isterseniz, süreci buna göre değiştirebilirsiniz.

+0

Yani, bu, projemin yalnızca iki kütüphane dosyasına değil, lib.a'ya başvurması gerektiği anlamına mı geliyor? – user230949

+0

Tam olarak yaptığım gibi yapsaydınız, evet, diğer iki dosyayı kaldırır ve yenisini kullanırsınız. –

+0

Ben sadece bir lib üzerinde buldum 'lipo-extract_family armv6' çağırmadan önce' lipo -remove armv7' aramak zorunda üzerinde çalıştım. – Liron

1

Cory Kilger cevabı yorum yapmak üne sahip olmadığı için ... sadece küçük bir çimdik gitmek doğru yoldur.

lipo -thin armv6 -output libTapjoy-armv6.a libTabjoy.a 

lipo man sayfası -ayıklayın diyor ve -extract_family hem üretmek:

benim Mac OS 10.8 sisteminde

, bu lipo komut ben ar ile kullanmak için .a dosyaları yapmak için kullanılan biridir evrensel .a dosyaları ve benim ar komutum onlardan bir şey çıkarmayacak.

İlgili konular