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