Ich versuche, GCC 4.9.2 verwenden, um eine Anwendung von Linux (x86_64-pc-Linux-gnu) für Windows (x86_64-w64-mingw32) zu kompilieren.undefined Verweis Kreuz kompilieren statische Bibliotheken mit LTO unter GCC
Beim Erstellen von Zielen, die mit statischen Bibliotheken verknüpfen und auch Link-Zeit-Optimierung verwenden, erhalte ich undefinierte Referenzfehler vom Linker für alle Symbole, die das Ziel aus der Bibliothek verwendet.
zB Gebäude bar aus bar.cpp
int bar (void) {return 42;}
und Verknüpfung mit foo.cpp
extern int bar (void);
int main (int, char**) {bar();}
die Linie Befehl
x86_64-w64-mingw32-g++ -flto -o foo.o -c foo.cpp
x86_64-w64-mingw32-g++ -flto -o bar.o -c bar.cpp
x86_64-w64-mingw32-gcc-ar rc bar.a bar.o
x86_64-w64-mingw32-gcc-ranlib bar.a
x86_64-w64-mingw32-g++ -flto -fuse-linker-plugin foo.o bar.a -o foo
Ergebnisse im Fehler
/tmp/ccc3Twsc.lto.o:foo.o:(.text+0x15): undefined reference to `bar()'
collect2: error: ld returned 1 exit status
Von oben:
- ich die gcc-Wrapper bin mit für ar/ranlib
- gibt es keine externen Abhängigkeiten
- alle Dateien mit den gleichen Optionen kompiliert werden
Ich habe versucht mit verschiedenen Kombinationen von-fuse-Linker-Plugin, gcc-ar vs ar, Symbol Sichtbarkeit Optionen, Optimierungen, etc., aber ich kann es nicht richtig verknüpfen ohne LTO ausschalten.
Alle Ziele korrekt unter dem nativen Compiler (x86_64 Linux).
Gibt es etwas Offensichtliches, das ich hier vermisse?
Danke für die Bestätigung. Leider -ffat-lto-objects erlaubt dem Linker, auf die Standardmethode der Verknüpfung zurückzugreifen und mehr oder weniger negiert LTO für meine Zwecke (mit vielen Convenience-Bibliotheken). – dcro
Beachten Sie auch, dass 'gcc-ar' (im Gegensatz zu' ar') wahrscheinlich eine Anforderung zur Bestätigung ist, da 'ar' die LTO/GIMPLE-Objektabschnitte nicht versteht. 'gcc- {ar, ralib, nm}' sind temporäre Wrapper, die die relevanten Abschnitte erhalten/verstehen. – dcro