2011-12-04 8 views
12


Alcuni retroscena - Ho costruito un quadro personalizzato utilizzando la guida di Diney a http://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/ld: duplicare simbolo _objc_retainedObject su iOS 4.3, ma non su iOS 5.0

sua built sia per ARMv6/ARMv7, il suo un ARC- quadro di riferimento, compilato con un obiettivo di depolyment di 4.3.

Quando inserisco il framework risultante in un progetto 5.0 funziona perfettamente, ma quando lo inserisco in un progetto 4.3 (ARC o non-arc, non importa), ottengo il seguente che non riesco a capire. ..

Ho anche provato ad aggiungere libarclite.a manualmente ma non ha modificato nulla.

ld: duplicato simbolo _objc_retainedObject in /Users/freak4pc/Project/MyFramework.framework/MyFramework e /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(arclite.o) per l'architettura ARMv7 comando /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang non riuscita con codice di uscita 1

Gradirei qualsiasi aiuto su questo.
Grazie
Shai

+0

Perché non creare una libreria statica come fanno tutti gli altri per iOS? L'approccio a cui ti sei collegato sembra una specie di trucco, quindi non sono sorpreso che le cose non possano essere collegate come previsto. –

+0

Uhm ho appena ricevuto un suggerimento che le librerie statiche non sono così flessibili. Potresti collegarmi ad alcune risorse su questo forse? –

+0

Non sono sicuro di cosa significhi "meno flessibile" in questo caso. Se hai il codice per la tua libreria, c'è poca differenza nell'uso tra una libreria statica e un framework. Se stai distribuendo la libreria precompilata, tutto ciò che devi fare è assicurarti che anche le intestazioni siano disponibili. Per un esempio, consulta la libreria Core Plot: http://code.google.com/p/core-plot/, che utilizza un framework per Mac e una libreria statica per iOS. Non ricordo che sia difficile impostare la compilazione della libreria statica lì. –

risposta

15

Sto lottando con lo stesso problema. La soluzione alternativa è quindi impostare l'obiettivo di distribuzione del tuo framework su iOS5 (verifica se ciò non comporti comunque altri problemi).

Quindi il deve utilizzare ARC nel progetto principale se si seleziona come target iOS4, altrimenti manca la libarclite. La mia soluzione sarà quella di fornire due framework, a seconda se usano ARC o meno.

Ecco due link ai forum dev di Apple con un po 'di più informazioni: https://devforums.apple.com/message/539344#539344

https://devforums.apple.com/message/588316#588316

Aggiornamento: c'è un modo migliore. Costruisci la tua libreria statica con target minimo iOS5 e aggiungi manualmente /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a (e /Developer/usr/lib/arc/libarclite_iphonesimulator.a) se il tuo il progetto è non utilizzando ARC e necessita del supporto per iOS4.

Aggiornamento 2: In realtà, basta usare il flag del linker -fobjc-arc; questo collegherà libarclite alla libreria se non è già lì. Soluzione migliore.

+0

Non è una cattiva idea, mal provatelo! Grazie ! –

+0

Grazie, è un modo migliore. aggiungi manualmente /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a (e /Developer/usr/lib/arc/libarclite_iphonesimulator.a) – HelloWorld

2

Wow è stata una corsa dura ma alla fine l'ho risolto!

Ciò che ha scatenato l'idea finale è stato il commento di @ steipete, È un po 'una situazione complessa, quindi cercherò di spiegarlo a chiunque abbia superato questo problema.

  1. Compilare un framework abilitato per ARC su iOS 4.3 collegherà automaticamente libarclite.so a "bridge" 4.3 ARC con 5.0 ARC. Quando questo framework è stato importato in un progetto 4.3, arclite è stato effettivamente collegato due volte - una volta per il framework (che è 4.3), e una volta per il progetto stesso - che ha causato l'errore "duplicate symbol", il che significa che il framework deve essere compilato su 5.0 e il progetto può essere 4.3. Ma allora ;
  2. Il mio framework utilizza AFNetworking di @mattt per eseguire richieste HTTP e analisi JSON di AP diversi.AFNetworking controlla automaticamente durante la compilazione se il target è iOS5 e, in caso affermativo, utilizza NSJSONSerialization, altrimenti ricade su qualsiasi libreria JSON importata come JSONKit.
  3. Quando si compila il framework AFNetworking-enabled per iOS5 (per evitare il problema numero 1), si collega automaticamente NSJSONSerialization, che causerà un'eccezione su 4.3 progetti, il che significa che si dovrà cercare manualmente le istruzioni di compilazione e rimuovere il chiama allo NSJSONSerialization prima di compilarlo, quindi ricade automaticamente nella libreria compatibile con 4.3 (nel mio caso JSONKit). Questa condizione di compilazione si trova su AFHTTPClient.m e AFJSONRequestOperation.m (ad esempio #if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3 || __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_6)
  4. Dopo aver rimosso tali condizioni, ho compilato correttamente il framework per iOS5 con JSONKit invece di NSJSONSerialization e sono riuscito a utilizzarlo con successo nel mio iOS4.3 progetto.

Spero che questo potrebbe aiutare chiunque altro possa lottare con questo per un paio di giorni come me :)

Shai.

+0

Onestamente, non vedo la tua risposta aggiungendo più valore (# 2, # 3 e # 4 non sono nemmeno rilevanti per la domanda), quindi lascia un gusto amaro che hai contrassegnato _your own_ answer come corretto. Ti sei perso anche a spiegare la problematica che il tuo progetto principale deve usare ARC se usi ARC senza aggiungere libarclite.so in un sottoprogetto, se deve supportare iOS 4.x. – steipete

+0

Mi dispiace ma non sono davvero d'accordo con te. Non ho alcun problema a contrassegnare la tua risposta come "quella giusta" (non ho punti per segnare il mio) - ma penso che la mia risposta sia più completa in quanto spiega l'intero processo. 2-3-4 sono stati quelli che mi hanno impedito di usare il tuo suggerimento, quindi sono MOLTO rilevanti. Inoltre, credo sia la mia domanda, quindi chiamare ciò che è rilevante e quale non è la mia scelta. Apprezzo molto il tuo aiuto, ma penso che il tuo commento qui sia fuori luogo. –

+1

Deve essere d'accordo con steipete. La tua "risposta" potrebbe essere pertinente al tuo progetto, ma è irrilevante per i problemi che stiamo vedendo. – wuf810

Problemi correlati