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

У меня есть проект 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.

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

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

 gcc foo.c -Wl,-Bstatic -lbar -lbaz -lqux -Wl,-Bdynamic -lcorge -o foo.exe 
  • Создание объектов: конструкторы или статические заводские методы
  • В чем разница между функцией static func и class func в Swift?
  • Использование инициализаторов и конструкторов в Java
  • Что означает «статическое» значение в C?
  • статическая функция в C
  • Как обслуживать статические файлы из другого каталога, чем статический путь?
  • Зачем использовать статический вложенный интерфейс в Java?
  • Почему все поля в интерфейсе неявно статичны и окончательны?
  • Изменение частного статического конечного поля с использованием отражения Java
  • Статический вложенный class в Java, почему?
  • Почему class System.Random не статичен?
  • Давайте будем гением компьютера.