web-dev-qa-db-fra.com

Puis-je mélanger des bibliothèques d'objets statiques et partagés lors de la liaison?

J'ai un projet C qui produit dix exécutables, que j'aimerais tous être liés statiquement. Le problème auquel je suis confronté est que l'un de ces exécutables utilise une bibliothèque tierce dont seule la version d'objet partagé est disponible.

Si je passe le -static drapeau à gcc, ld affichera une erreur en disant qu'il ne peut pas trouver la bibliothèque en question (je suppose qu'il recherche la version .a) et l'exécutable ne sera pas construit. Idéalement, je voudrais pouvoir dire à 'ld' de lier statiquement autant que possible et de basculer vers la bibliothèque d'objets partagés si aucune bibliothèque statique ne peut être trouvée.

Dans l'interium, j'ai essayé quelque chose comme gcc -static -lib1 -lib2 -shared -lib3rdparty foo.c -o foo.exe dans l'espoir que 'ld' lierait statiquement dans lib1 et lib2 mais n'aurait qu'une dépendance à l'exécution sur lib3rdparty. Malheureusement, cela n'a pas fonctionné comme je l'avais prévu; à la place, le -shared le drapeau a remplacé le -static flag et tout a été compilé en tant qu'objets partagés.

Est-ce que le lien statique est un accord tout ou rien, ou existe-t-il un moyen de mélanger et assortir?

53
SiegeX

En regardant ce fil vous pouvez voir que cela peut être fait. Les gars de GNU suggèrent

gcc foo.c -Wl,-Bstatic -lbar -lbaz -lqux -Wl,-Bdynamic -lcorge -o foo.exe
63
Anthony