c++ - compilar - instalar librerias de c en linux
Cómo forzar a gcc a vincular una biblioteca estática no utilizada (4)
La sugerencia original fue "cercana":
Prueba esto: -Wl,--whole-archive -lyourlib
Tengo un programa y una biblioteca estática:
// main.cpp
int main() {}
// mylib.cpp
#include <iostream>
struct S {
S() { std::cout << "Hello World/n";}
};
S s;
Quiero vincular la biblioteca estática ( libmylib.a
) con el objeto del programa ( 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?
Me gustan las otras respuestas mejor, pero aquí hay otra "solución".
Use el comando ar para extraer todos los archivos .o del archivo.
cd mylib ; ar x /path/to/libmylib.a
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.
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