Могу ли я смешивать статические и общедоступные библиотеки при связывании? - программирование
Подтвердить что ты не робот

Могу ли я смешивать статические и общедоступные библиотеки при связывании?

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

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

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

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

4b9b3361

Ответ 1

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

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