2010-09-13 25 views
46

J'ai un programme qui relie à de nombreuses bibliothèques. g++, par défaut, préfère lier aux bibliothèques partagées, même si l'archive correspondante existe.g ++ linker: force la liaison statique si la bibliothèque statique 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?

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

+0

Voir aussi: http://stackoverflow.com/questions/4500158/how-can-i-force-linking-with-a-static-library-when-a-shared-library-of-same-name – Antonio

Répondre

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

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

5

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

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

Modifier le 3 août 17: Je viens trébuché à travers this answer qui va plus en détail et offre une alternative (-l:) pour spécifier la bibliothèque directement.