2009-01-19 6 views
11

Mein Xcode-Ziel verlinkt gegen die hdf5-Bibliothek (unter Verwendung der Link-Binär-mit-Bibliotheken-Build-Phase). libhdf5 wird mit MacPorts installiert, daher enthält/opt/local/lib sowohl die dynamische (.dylib) als auch die statische (.a) Version der Bibliothek.Statische Verknüpfung der mit Xcode-Ziel verknüpften Bibliothek erzwingen?

Die Textausgabe vom Build zeigt, dass es im Verknüpfungsschritt des Builds wie erwartet einen -lhdf5 gibt. gcc scheint jedoch die dynamisch verknüpfte Bibliothek über die statische zu nehmen. Gibt es eine Möglichkeit, gcc (über einen Compiler-Switch oder über Xcode) zu zwingen, statisch mit libhdf5.a zu verlinken?

Die einzige Lösung, die ich gefunden habe, ist libhdf5.a in das Projekt (oder andere) Verzeichnis zu kopieren und mit dieser Kopie zu verknüpfen, so dass dynamische und statische Versionen am gleichen Ort vermieden werden.

+0

Ich würde gerne einige aktualisierte Antworten auf diese Frage zu sehen mit Anweisungen für neuere Versionen von Xcode. – livingtech

Antwort

7

In Reaktion auf Ihren Kommentar zu Eduard Wirch‘Antwort: Sie auch nur statische Linken für diese eine Bibliothek steuern kann, wenn man durch ersetzen -lhdf5 - l/full/path/to/libhdf5.a

+8

Es sieht so aus, als ob das "-l" tatsächlich weggelassen werden muss, nach der anderen gegebenen Antwort. Wenn ich es einschließe, gibt mir der Linker "ld: library not found für -l/opt/local/lib/libhdf5.a", während ich einfach den Pfad "/ opt/local/lib/libhdf5" übergebe.ein "ohne Flagge funktioniert gut. – spieden

+0

Wie würde man dies bei der Verwendung von Automake beheben? – meijuh

1

Benutzen Sie den „-static“ -Schalter für die Verknüpfung: GCC link options

+0

Wird dadurch die statische Verknüpfung aller Bibliotheken forciert, oder kann die Anwendung pro Bibliothek gesteuert werden? –

+0

Eigentlich wird es alle Bibliotheken statisch verknüpfen. –

13

Hatte genau dieses Problem und obwohl es eine alte Post ist, dachte ich, ich würde teilen, was ich tun musste, um diese Arbeit zu machen.

In der Regel stellen Sie dem Linker nur den Schalter '-static' zur Verfügung, aber mit Xcode werden alle Bibliotheken einschließlich der CRT statisch verknüpft. Ich habe den Fehler:

can't locate file for: -lcrt0.o 

Als ich das versuchte.

Die Sache, die war für mich gearbeitet zu ersetzen:

-lmylib 

mit

/path/to/libmylib.a

Hinweis: Die -l fallen gelassen wird.

3

Mein Fall mit Xcode 4.5:

Wenn ich eine statische C-Bibliothek (eine 3rd-Party-Bibliothek kompiliert mit GNU Autotools) auf Projektrahmen ziehen (Project Navigator > Frameworks) der Linker scheint, das ist eine dynamische Bibliothek denkt und fügt -L -l Fahnen:

-L/path/to/libfoodir -lfoo 

Die Verknüpfung fehlschlägt, weil es keine /path/to/libfoodir/libfoo.dylib ist. Der Linker-Befehl kann aus gesehen werden:

Log Navigator > select a Build log > select a Link line and expand it 

Die Verknüpfung gelingt, wenn ich einen vollständigen Pfad (/path/to/libfoodir/libfoo.a) an den Linker-Einstellungen hinzufügen:

Targets > Build Settings (all) > Other linker flags 
Verwandte Themen