2014-12-09 24 views
6

Sto tentando di utilizzare GCC 4.9.2 per compilare cross un'applicazione da Linux (x86_64-pc-linux-gnu) per Windows (x86_64-w64-mingw32).librerie statiche di compilazione incrociate di riferimento non definite con LTO sotto GCC

Quando si creano target che si collegano a librerie statiche e si utilizza anche l'ottimizzazione link-time ottengo errori di riferimento non definiti dal linker per tutti i simboli che l'obiettivo utilizza dalla libreria.

ad esempio, la costruzione di bar.a da bar.cpp

int bar (void) {return 42;} 

e che collega foo.cpp

extern int bar (void); 
int main (int, char**) {bar();} 

utilizzando la riga di comando

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 

genera l'errore

/tmp/ccc3Twsc.lto.o:foo.o:(.text+0x15): undefined reference to `bar()' 
collect2: error: ld returned 1 exit status 

Dall'alto:

  • Sto usando le gcc-wrapper per ar/ranlib
  • non ci sono dipendenze esterne
  • tutti i file vengono compilati con le stesse opzioni

ho ho provato a utilizzare varie combinazioni di -fuse-linker-plugin, gcc-ar vs ar, opzioni di visibilità dei simboli, ottimizzazioni, ecc. ma non riesco a collegarmi correttamente senza disattivare LTO.

Tutti i target vengono compilati correttamente con il compilatore nativo (x86_64 Linux).

C'è qualcosa di ovvio che mi manca qui?

risposta

1

Sono in grado di riprodurre questo problema di collegamento su Mingw32-gcc 4.9.2 con Win7 a 64 bit. Tuttavia, sono riuscito a collegare con successo con l'aggiunta di -ffat-lto-objects come una soluzione:

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

Grazie per la conferma. Sfortunatamente -ffat-lto-objects consente al linker di tornare al metodo standard di collegamento e più o meno nega LTO per i miei scopi (utilizzando molte librerie di convenienza). – dcro

+3

Inoltre, si noti che 'gcc-ar' (al contrario di' ar') sarà probabilmente un requisito per confermare come 'ar' non comprende le sezioni dell'oggetto LTO/GIMPLE. 'gcc- {ar, ranlib, nm}' sono wrapper temporanei che preservano/capiscono le sezioni rilevanti. – dcro

Problemi correlati