web-dev-qa-db-fra.com

éditeur de liens g ++: forcer la liaison statique si une bibliothèque statique existe?

J'ai un programme qui relie à de nombreuses bibliothèques. g++, par défaut, préfère se lier aux bibliothèques partagées, même si l'archive correspondante existe.

Comment puis-je modifier cette préférence pour préférer les archives statiques aux bibliothèques dynamiques, s'il existe une archive statique?

Remarque, j'ai utilisé -static option, mais il essaie de trouver des archives statiques pour toutes les bibliothèques, ce qui n'est pas ce que je veux.

55
kumar
g++ -Wl,-Bstatic -lz -lfoo -Wl,-Bdynamic -lbar -Wl,--as-needed

Liera zlib et libfoo comme statique et libbar comme dynamique. --as-needed supprimera toute bibliothèque dynamique inutilisée.

68
naideflan

Lorsque vous souhaitez uniquement lier statiquement une ou deux bibliothèques aux autres, y compris les bibliothèques système, étant dynamique, il est souvent plus facile de simplement référencer la bibliothèque statique par son nom complet. C'est à dire. plutôt que d'utiliser -l et -L pour que g ++ résout une bibliothèque à partir de ce qu'il trouve, ajoutez simplement le chemin complet de la bibliothèque en entrée. En prenant la commande g ++ ci-dessus, pour lier un main.o programme principal d'application pour libz statique et libfoo et libbar dynamique et libglib etc.:

    g++ main.o /usr/lib/libz.a /usr/lib/libfoo.a -lbar

Edit 3 août 17: Je viens de trébucher sur cette réponse qui va plus en détail et propose une alternative (-l:) pour spécifier directement la bibliothèque.

5
stanthomas