c++ gcc lto

c++ - ¿Cómo puedo usar lto con bibliotecas estáticas?



gcc (2)

Como respuesta complementaria: con GCC también existe la posibilidad de usar -ffat-lto-objects que agrega un código de objeto clásico a los archivos en el archivo. Esto hace posible utilizar la biblioteca estática en el código que construye sin -flto.

Cuando intento crear bibliotecas estáticas con -flto , obtengo errores de referencia indefinidos:

library.cpp :

#include <iostream> void foo() { std::cout << "Test!" << std::endl; }

main.cpp :

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

Salida de compilación :

$ 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

Funciona bien si me vinculo con library.o lugar de library.a . ¿Qué me estoy perdiendo? Esto es con GCC 4.9.1 y binutils 2.24.


La respuesta, como descubrí en this post del desarrollador de GCC Honza Hubička, es usar el envoltorio gcc-ar lugar de ar por sí mismo:

$ gcc-ar rcs library.a library.o

Esto invoca a ar con los argumentos correctos del plugin, en mi caso fueron

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