2014-09-16 28 views
13

Quando provo a costruire librerie statiche con -flto, ottengo errori di riferimento definiti:Come posso usare lto con le librerie statiche?

library.cpp:

#include <iostream> 

void foo() { 
    std::cout << "Test!" << std::endl; 
} 

main.cpp:

void foo(); 

int main() { 
    foo(); 
    return 0; 
} 

Compilation uscita:

$ g++ -flto -c library.cpp 
$ ar rcs library.a library.o 
$ g++ -flto main.cpp library.a 
/tmp/ccZIgxCY.ltrans0.ltrans.o: In function `main': 
ccZIgxCY.ltrans0.o:(.text+0x5): undefined reference to `foo()' 
collect2: error: ld returned 1 exit status 

Funziona bene se collego con library.o anziché library.a. Cosa mi manca? Questo è con GCC 4.9.1 e binutils 2.24.

+0

Hai provato 'g ++ -flto -lrary main.cpp'? –

+0

@ πάνταῥεῖ Anche rotto. Ma ho trovato la risposta mentre stavo scrivendo la domanda, è pubblicata qui sotto. –

risposta

19

La risposta, come ho scoperto da this post di GCC sviluppatore Honza Hubicka, è quello di utilizzare il gcc-ar involucro anziché ar di per sé:

$ gcc-ar rcs library.a library.o 

Questo invoca ar con gli argomenti del plugin giusto, a mio case erano

--plugin /usr/lib/gcc/x86_64-unknown-linux-gnu/4.9.1/liblto_plugin.so 
+6

Vale la pena notare che ci sono anche 'gcc-ranlib' e' gcc-nm' se ne avete bisogno. – rodrigo

+0

@rodrigo In effetti - sembra che "ar" sia solo una parte dell'immagine. Dovevo anche eseguire l'override con 'gcc-ranlib', poiché l'impostazione predefinita del sistema non poteva gestire gli oggetti LTO. Quindi, dal momento che sembra difficile trovare qualcosa che si avvicina a una soluzione one-liner a questo: ho ottenuto LTO lavorando come segue: './configure --prefix =/opt/testmake AR = gcc-ar RANLIB = gcc-ranlib CXXFLAGS = ' -O3 -flto'' –

+0

@underscore_d Come dice 'man ranlib', è equivalente a 'ar s'. Creo tutte le mie librerie statiche con 'gcc-ar rcs', solo un passo. –

Problemi correlati