Cómo forzar a gcc a vincular una biblioteca estática no utilizada

Tengo un progtwig y una biblioteca estática:

// main.cpp int main() {} // mylib.cpp #include  struct S { S() { std::cout << "Hello World\n";} }; S s; 

Quiero vincular la biblioteca estática ( libmylib.a ) con el objeto del progtwig ( main.o ), aunque este último no usa ningún símbolo del anterior directamente.

Los siguientes comandos no parecen funcionar con g++ 4.7 . Se ejecutarán sin errores ni advertencias, pero aparentemente libmylib.a no estará vinculado:

 g++ -o program main.o -Wl,--no-as-needed /path/to/libmylib.a 

o

 g++ -o program main.o -L/path/to/ -Wl,--no-as-needed -lmylib 

¿Tienes alguna idea mejor?

Utilice la opción del enlazador de --whole-archive .

Las bibliotecas que vengan después en la línea de comando no tendrán símbolos sin referencia descartados. Puede reanudar el comportamiento normal de enlace agregando --no-whole-archive después de estas bibliotecas.

En su ejemplo, el comando será:

 g++ -o program main.o -Wl,--whole-archive /path/to/libmylib.a 

En general, será:

 g++ -o program main.o \ -Wl,--whole-archive -lmylib \ -Wl,--no-whole-archive -llib1 -llib2 

La sugerencia original fue “cercana”:

  • Cómo forzar a gcc a vincular objetos C ++ estáticos no referenciados desde una biblioteca

Prueba esto: -Wl,--whole-archive -lyourlib

Me gustan las otras respuestas mejor, pero aquí hay otra “solución”.

  1. Use el comando ar para extraer todos los archivos .o del archivo.

     cd mylib ; ar x /path/to/libmylib.a 
  2. A continuación, agregue todos los archivos .o al comando del enlazador

     g++ -o program main.o mylib/*.o 

Si hay una función específica en la biblioteca estática que el enlazador elimina como no utilizada, pero realmente la necesita (un ejemplo común es la función JNI_OnLoad () ), puede forzar al enlazador a mantenerla (y, naturalmente, todo el código que se llama desde esta función). Agregue -u JNI_OnLoad a su comando de enlace.