Warum ist -force_load für meine drei20 Abhängigkeiten in XCode 4.2 nicht mehr erforderlich?

7

Ich habe ein Projekt mit einer Abhängigkeit von einer statischen Bibliothek eines Drittanbieters und den drei20 Bibliotheken. Um in XCode 3.X mein Projekt kompilieren zu lassen, musste ich das Flag -force_load in der Erstellungseinstellung "Other Linker Flags" verwenden und jede der drei 20 Bibliotheken angeben, die ich einbeziehen wollte.

Beim Versuch, ein Archiv in XCode 4.2 zu erstellen, erhielt ich einen Fehler "doppeltes Symbol". Ich löste das, indem ich die sieben separaten -force_load-Flags entfernte, die sich auf jede der drei 20 Bibliotheken bezogen, von denen ich abhängig war.

Mein Projekt wird jetzt erfolgreich erstellt.

Ich frage mich, ob jemand mir erklären kann, warum diese Änderung funktioniert hat? Gab es einen Fehler, den XCode 4.2 behoben hat, oder ist das eine Verhaltensänderung? In diesem Beitrag wird vorgeschlagen , dass ein Fehler in XCode 3.2 aufgetreten ist , aber es wäre großartig, wenn jemand für mich dieses Thema weiter beleuchten könnte, damit ich sicher sein kann, dass ich durch das Entfernen der Flags -force_load möglicherweise nichts falsch gemacht habe.

Danke!

    
esilver 30.10.2011, 00:40
quelle

1 Antwort

19

Beim Erstellen einer statischen Bibliothek (wie für iOS erforderlich) ist eines der Probleme, die auftreten können, Symbole aus Kategorien in diese Bibliothek einzufügen, damit sie von einer Anwendung verwendet werden können. Das Linker-Flag -ObjC sollte genügend Informationen einbeziehen, um Kategorien in diese Build-Frameworks einzubeziehen, wie Dave Dribin in seinem Artikel hier .

Allerdings funktioniert das zwischen iPhone OS 2.0 und 3.0 nicht mehr richtig. Wie ich in diese Antwort erwähnte , dieses Problem trat im Core Plot-Framework auf und wir mussten das Flag -all_load linker hinzufügen, damit das Framework richtig funktioniert. Apple selbst hat Technisches Q & amp; A QA1490 gepostet, in dem dieses Problem erwähnt wird:

  

Für 64-Bit- und iPhone-OS-Anwendungen gibt es einen Linker-Bug, der   verhindert, dass -ObjC Objektdateien aus statischen Bibliotheken lädt   enthalten nur Kategorien und keine Klassen. Die Problemumgehung besteht darin, die   -all_load oder -force_load Flags.

     

-all_load zwingt den Linker, alle Objektdateien aus jedem Archiv, das er sieht, zu laden, selbst solche ohne Objective-C-Code. -force_load ist   verfügbar in Xcode 3.2 und höher. Es ermöglicht eine feinere Kornkontrolle von   Archivladen Auf jede Option -force_load muss ein Pfad zu folgen   ein Archiv, und jede Objektdatei in diesem Archiv wird geladen.

Leider besteht der Nebeneffekt darin, dass doppelte Symbole, die aus mehreren Bibliotheken verlinkt sind, Fehler verursachen können, wie Sie sie kennen.

Ich habe dazu einen Fehlerbericht eingereicht (zurück im Jahr 2009), und es scheint, dass die neueste Version von LLVM, die jetzt in Xcode verwendet wird, nicht länger unter diesem Linker-Fehler leidet. Ich habe versucht, nur -ObjC mit dem statischen iOS-Bibliotheksziel "Core Plot" zu verwenden, und es funktioniert jetzt einwandfrei. Das sind willkommene Neuigkeiten.

    
Brad Larson 30.10.2011, 02:20
quelle

Tags und Links