Мне кажется странным использовать -Wl,-Bstatic
, чтобы сказать, с gcc
какими библиотеками я хочу связать статически. Ведь всю остальную gcc
информацию о линковке с библиотеками я рассказываю напрямую ( -Ldir
, -llibname
).
Можно ли напрямую указать драйверу gcc, какие библиотеки должны быть связаны статически?
Уточнение: я знаю, что если определенная библиотека существует только в статических версиях, она будет использовать ее без -Wl,-Bstatic
, но я хочу иметь в виду, gcc
что предпочитаю статическую библиотеку. Я также знаю, что указание файла библиотеки напрямую свяжется с ним, но я предпочитаю сохранить семантику включения статических и динамических библиотек одинаковой.
источник
-l:
вариант задокументирован? Какая версия gcc мне нужна?ld
компоновщика sourceware.org/binutils/docs/ld/Options.html "-l namespec
.. Если namepec имеет форму: filename, ld будет искать в пути к библиотеке файл с именем filename, в противном случае он будет искать библиотеку путь к файлу с именем libnamespec.a. .. в системах ELF .. ld будет искать в каталоге библиотеку с именем libnamespec.so перед поиском библиотеки с именем libnamespec.a ... Обратите внимание, что это поведение не применяется к: filename , который всегда указывает файл с именем filename. ". Начиная с binutils 2.18 - sourceware.org/binutils/docs-2.18/ld/Options.htmlВы можете добавить файл .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:
Предполагая, что по умолчанию ld использует динамические библиотеки (это в Linux).
источник
gcc
.gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3
делает свое дело.-l
и также-L
являются параметрами компоновщика.gcc yourfiles /path/to/library/libLIBRARY.a
или-Wl,-Bstatic
?/path/to/library/libLIBRARY.a
требует написания полного пути, вариант 2-Wl,-Bstatic -llib2 -Wl,-Bdynamic
просто длинный и добавляет 2 дополнительных параметра и предполагает режим по умолчанию как Bdynamic, а принятый вариант 3-l:libXYZ.a
короткий и просто работает. Все три будут работать во многих случаях, а вариант 2 может не работать при компоновке статических программ. Насколько я понимаю, фактический этап связывания библиотеки одинаков для всех вариантов.