Ответ 1
Можно, конечно, использовать -l:
вместо -l
. Например -l:libXYZ.a
для связи с libXYZ.a
. Обратите внимание на выписку lib
, в отличие от -lXYZ
, которая автоматически расширится до libXYZ
.
Мне кажется странным использовать -Wl,-Bstatic
, чтобы сообщить gcc
, какие библиотеки я хочу связать со статически. В конце концов я рассказываю gcc
напрямую всю другую информацию о связи с библиотеками (-Ldir
, -llibname
).
Можно ли напрямую указать драйверу gcc, какие библиотеки должны быть связаны статически?
Уточнение: Я знаю, что если определенная библиотека существует только в статических версиях, она будет использовать ее без -Wl,-Bstatic
, но я хочу, чтобы gcc
предпочла статическую библиотеку. Я также знаю, что указание файла библиотеки напрямую будет связано с ним, но я предпочитаю сохранять семантику для включения в нее статических и динамических библиотек.
Можно, конечно, использовать -l:
вместо -l
. Например -l:libXYZ.a
для связи с libXYZ.a
. Обратите внимание на выписку lib
, в отличие от -lXYZ
, которая автоматически расширится до libXYZ
.
Вы можете добавить файл .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).