Могу ли я смешивать статические и общедоступные библиотеки при связывании?
У меня есть проект C, который создает десять исполняемых файлов, все из которых я хотел бы связать статически. Проблема, с которой я сталкиваюсь, заключается в том, что в одном из этих исполняемых файлов используется сторонняя библиотека, для которой доступна только версия с общими объектами.
Если я -static
флаг в gcc, ld будет ошибочно заявлять, что он не может найти интересующую библиотеку (я полагаю, что он ищет версию .a), и исполняемый файл не будет создан. В идеале я хотел бы сказать ‘ld’ статически связать столько, сколько может, и перейдем к общей библиотеке объектов, если статическая библиотека не может быть найдена.
В interium я попробовал что-то вроде gcc -static -lib1 -lib2 -shared -lib3rdparty foo.c -o foo.exe
в надежде, что ‘ld’ будет статически связываться в lib1 и lib2, но будет иметь только зависимость от lib3rdparty. К несчастью, это не сработало, как я предполагал; вместо этого флаг -shared -shared
–статический флаг, и все было скомпилировано как shared-objects.
- Статические блоки инициализации
- C ++: Когда (и как) называются глобальные статические конструкторы C ++?
- Почему class System.Random не статичен?
- Java Static vs Instance
- Статический анализ графика вызовов Java
Статически связывает сделку «все или ничего», или есть способ, которым я могу смешивать и сопоставлять?
- Можно ли заставить CMake создавать статическую и общую версию одной и той же библиотеки?
- Порядок инициализации статических переменных
- статическая функция в C
- Статические виртуальные элементы C ++?
- Из статической библиотеки MinGW (.a) в статическую библиотеку Visual Studio (.lib)
- Почему все поля в интерфейсе неявно статичны и окончательны?
- Статические правила сериализации Java?
- Возвращает указатель на статическую локальную переменную?
Посмотрев на эту тему, вы можете увидеть, что это можно сделать. Ребята из GNU предлагают
gcc foo.c -Wl,-Bstatic -lbar -lbaz -lqux -Wl,-Bdynamic -lcorge -o foo.exe