Передача gcc непосредственно для связывания библиотеки статически

Мне кажется странным использовать -Wl,-Bstatic, чтобы сообщить gcc, какие библиотеки я хочу связать со статически. В конце концов я рассказываю gcc напрямую всю другую информацию о связи с библиотеками (-Ldir, -llibname).

Можно ли напрямую указать драйверу gcc, какие библиотеки должны быть связаны статически?

Уточнение: Я знаю, что если определенная библиотека существует только в статических версиях, она будет использовать ее без -Wl,-Bstatic, но я хочу, чтобы gcc предпочла статическую библиотеку. Я также знаю, что указание файла библиотеки напрямую будет связано с ним, но я предпочитаю сохранять семантику для включения в нее статических и динамических библиотек.

Ответ 1

Можно, конечно, использовать -l: вместо -l. Например -l:libXYZ.a для связи с libXYZ.a. Обратите внимание на выписку lib, в отличие от -lXYZ, которая автоматически расширится до libXYZ.

Ответ 2

Вы можете добавить файл .a в команду связывания:

  gcc yourfiles /path/to/library/libLIBRARY.a

Но речь идет не о драйвере gcc, а о компоновщике ld, как в опциях, подобных -Wl,anything.

Когда вы сообщаете gcc или ld -Ldir -lLIBRARY, компоновщик проверяет как статическую, так и динамическую версии библиотеки (вы можете увидеть процесс с -Wl,--verbose). Для изменения порядка проверенных типов библиотек вы можете использовать -Wl,-Bstatic и -Wl,-Bdynamic. Вот справочная страница GNU LD: http://linux.die.net/man/1/ld

Чтобы связать вашу программу с lib1, lib3 динамически и lib2 статически, используйте такой вызов gcc:

gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3

Предполагая, что по умолчанию ld использует динамические библиотеки (это в Linux).