que librerias instalar compilar como c++ c gcc g++ ld

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".

  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.


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