Указание gcc напрямую связать библиотеку статически


133

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

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

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

Ответы:


189

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


63
Боже, если бы только Gnu сделал это по умолчанию, а не безумие с префиксом lib. О время и разочарование, которые мы бы сэкономили.
Timmmm 06

9
Радек, этот -l:вариант задокументирован? Какая версия gcc мне нужна?
osgx

18
Фактически, это опция 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
osgx

17
GNU нигде не отвечает за этот интерфейс, он унаследован от инструментария Unix.
аким

Жаль, что это не работает в компоновщиках, отличных от GNU. Это хороший способ «заставить» LDLIBS и аналогичные параметры конфигурации находить статические библиотеки без странных обходных путей с флагом ссылки.
nneonneo

130

Вы можете добавить файл .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).


3
Краткая версия: с током этого не сделать gcc.
Элазар Лейбович

7
Элазар Лейбович, но все же gcc program.o -llib1 -Wl,-Bstatic -llib2 -Wl,-Bdynamic -llib3делает свое дело.
osgx 05

13
Связывание (и поиск динамических / статических библиотек) выполняется компоновщиком, поэтому вы должны использовать параметры компоновщика. -lи также -Lявляются параметрами компоновщика.
osgx 05

3
Проголосовали за этот ответ из-за gcc yourfiles /path/to/library/libLIBRARY.aили -Wl,-Bstatic?
Тор Клингберг

7
@TorKlingberg, Вариант 1 /path/to/library/libLIBRARY.aтребует написания полного пути, вариант 2 -Wl,-Bstatic -llib2 -Wl,-Bdynamicпросто длинный и добавляет 2 дополнительных параметра и предполагает режим по умолчанию как Bdynamic, а принятый вариант 3 -l:libXYZ.aкороткий и просто работает. Все три будут работать во многих случаях, а вариант 2 может не работать при компоновке статических программ. Насколько я понимаю, фактический этап связывания библиотеки одинаков для всех вариантов.
osgx
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.