Могу ли я смешивать статические библиотеки и библиотеки общих объектов при компоновке? - PullRequest
51 голосов
/ 02 июня 2010

У меня есть проект C, который производит десять исполняемых файлов, все из которых я хотел бы связать статически. Проблема, с которой я сталкиваюсь, состоит в том, что один из этих исполняемых файлов использует стороннюю библиотеку, для которой доступна только версия общего объекта.

Если я передам флаг -static в gcc, ld выдаст ошибку, сообщив, что не может найти нужную библиотеку (я предполагаю, что она ищет версию .a), и исполняемый файл не будет собран. В идеале я хотел бы иметь возможность указывать 'ld' статически связываться как можно чаще и переключаться на библиотеку общих объектов, если статическая библиотека не может быть найдена.

В interium я пробовал что-то вроде gcc -static -lib1 -lib2 -shared -lib3rdparty foo.c -o foo.exe в надежде, что 'ld' будет статически связываться в lib1 и lib2, но будет зависеть только от времени исполнения lib3rdparty. К сожалению, это не сработало, как я хотел; вместо этого флаг -shared перезаписал флаг -static, и все было скомпилировано как разделяемые объекты.

Статически связывает сделку "все или ничего", или есть какой-то способ, которым я могу смешивать и сопоставлять?

1 Ответ

63 голосов
/ 02 июня 2010

Глядя на эту ветку вы видите, что это можно сделать. Ребята из GNU предлагают

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