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?
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
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