web-dev-qa-db-fra.com

Comment forcer gcc à lier une bibliothèque statique inutilisée

J'ai un programme et une bibliothèque statique:

// main.cpp
int main() {}

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

Je veux lier la bibliothèque statique (libmylib.a) à l'objet programme (main.o), bien que ce dernier n'utilise aucun symbole du premier directement.

Les commandes suivantes ne semblent pas fonctionner avec g++ 4.7. Ils s'exécuteront sans erreur ni avertissement, mais apparemment libmylib.a ne sera pas lié:

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

ou

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

Avez-vous de meilleures idées?

40
Martin

Utilisation --whole-archive option de l'éditeur de liens.

Les bibliothèques qui viennent après dans la ligne de commande ne verront pas les symboles non référencés rejetés. Vous pouvez reprendre un comportement de liaison normal en ajoutant --no-whole-archive après ces bibliothèques.

Dans votre exemple, la commande sera:

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

En général, ce sera:

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

La suggestion originale était "close":

Essaye ça: -Wl,--whole-archive -lyourlib

8
paulsm4

J'aime mieux les autres réponses, mais voici une autre "solution".

  1. Utilisez la commande ar pour extraire tous les fichiers .o de l'archive.

    cd mylib ; ar x /path/to/libmylib.a
    
  2. Ajoutez ensuite tous ces fichiers .o à la commande de l'éditeur de liens

    g++ -o program main.o mylib/*.o
    
6
brian beuning

S'il existe une fonction spécifique dans la bibliothèque statique qui est supprimée par l'éditeur de liens comme inutilisée, mais vous en avez vraiment besoin (un exemple courant est la fonction JNI_OnLoad ()), vous pouvez forcer l'éditeur de liens à le conserver (et naturellement, tout le code appelé depuis cette fonction). Ajouter -u JNI_OnLoad à votre commande de lien.

4
Alex Cohn