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