2014-12-09 15 views
6

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?

Antwort

1

Ich bin in der Lage, dieses Verknüpfungsproblem auf Mingw32-gcc 4.9.2 unter Win7 64-Bit zu reproduzieren. Allerdings habe ich es bekommen erfolgreich -ffat-lto-objects als Behelfslösung, indem zu verknüpfen:

g++ -flto -o foo.o -c foo.cpp 
g++ -flto -ffat-lto-objects -o bar.o -c bar.cpp 
ar rc bar.a bar.o 
g++ -flto -o foo.exe foo.o bar.a 
+4

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

+3

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