2011-10-17 11 views
10

Quando provo a fare funzionare la mia applicazione nel simulatore iOS 4.3 (Xcode 4.2), mi schianto quando ho colpito @autoreleasepool {}, con:condizionale linking per @autoreleasepool

dyld: lazy symbol binding failed: Symbol not found: _objc_autoreleasePoolPush 

mi sono guardato intorno, e ho vedere la soluzione alternativa è aggiungere libarclite_iphoneos.a. Esiste anche una versione di questo per il simulatore come libarclite_iphonesimulator.a.

Ho bisogno di aggiungere entrambe le librerie al mio progetto per farlo funzionare sia sul simulatore che sull'hardware. Ma qualunque cosa crei, si lamenta che l'altra libreria è per un'architettura non supportata.

Per esempio, la costruzione di simulatore:

ld: warning: ignoring file /Developer-4.2/Platforms/iPhoneOS.platform/ 
Developer/usr/lib/arc/libarclite_iphoneos.a, missing required architecture 
i386 in file 

Come posso risolvere entrambi questi allo stesso tempo? O dovrei limitarmi a utilizzare la vecchia sintassi NSAutoreleasePool per ora?

+0

Sembra essere un problema di clang poiché la modifica del compilatore nelle impostazioni di build per llvm-gcc-4.2 ha risolto il problema per me –

+0

Penso che sia stato risolto da allora; Non l'ho incontrato da mesi. –

risposta

10

Dopo una prova come pulire, pulire la cartella, reimpostare iPhone Simulator e anche un riavvio, ho cambiato il IPHONE_DEPLYMENT_TARGET sull'impostazione di generazione di destinazione da iOS 5.0 a iOS 4.2. lavorato.

+0

Verificherò nuovamente, forse è stato corretto. Grazie. –

+0

@amosel: quale versione di xcode stai usando? 4.2. o 4.2.1? –

+0

@JohannesRudolph Uso 4.2 Build 4D199 – amosel

1

È possibile utilizzare l'impostazione di creazione di altri Linker Flags per collegarsi alla libreria e specializzare il valore in base al fatto che sia "Qualsiasi iOS" o "Qualsiasi iOS Simulator".

+0

Sembra che dovrebbe funzionare. Ci sto lavorando. :) –

+1

@StevenFisher: Sono piuttosto confuso sul motivo per cui è necessario in primo luogo. Clang dovrebbe collegarsi nella libreria appropriata per te quando la tua destinazione di implementazione è pre-5.0. –

+0

Buon punto. Ho fatto ulteriori test. Sembra che si tratti di un problema durante la compilazione solo per il simulatore. Durante la compilazione per il dispositivo, include automaticamente il dispositivo. Ho dovuto aggiungere '$ {PLATFORM_DEVELOPER_USR_DIR}/lib/arc' a' LIBRARY_SEARCH_PATHS' e '-larclite_iphonesimulator' a' OTHER_LDFLAGS [sdk = iphonesimulator *] [arch = *] ', ma non c'era bisogno di fare un'impostazione per hardware iOS. Quindi questo è quasi certamente un bug. –

0

È inoltre possibile unire le due librerie statiche in una libreria universale. Andare al terminal e dire

lipo -create -output /where/you/want/it/libarclite_universal.a /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a /Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphonesimulator.a 

è possibile verificare il file risultante dicendo (in Terminal)

file /where/you/put/it/libarclite_universal.a 

Dovrebbe uscita:

libarclite_universal.a: Mach-O universal binary with 3 architectures 
libarclite_universal.a (for architecture i386):current ar archive random library 
libarclite_universal.a (for architecture armv6):current ar archive random library 
libarclite_universal.a (for architecture armv7):current ar archive random library 

Dal momento che questo lib è collegata in modo statico, la tua app finale non crescerà grazie alla libreria di sim inclusa, dal momento che solo ciò che è necessario dalla tua app verrà collegato all'app finale.