Повідомлення gcc безпосередньо для зв’язку бібліотеки статично


133

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

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

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

Відповіді:


189

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


63
Боже, якби тільки Гну зробив це за замовчуванням в першу чергу замість безумства префікса lib. О, час і розчарування ми зберегли б.
Timmmm

9
Радек, чи є цей -l:варіант документованим? Яку версію gcc мені потрібно використовувати?
osgx

18
Насправді, це варіант ldlinker sourceware.org/binutils/docs/ld/Options.html " -l namespec.. Якщо namepec має форму: filename, ld шукатиме шлях бібліотеки для файлу з назвою filename, інакше він буде шукати бібліотеку шлях до файлу, який називається libnamespec.a ... в системах ELF .., ld шукатиме в каталозі бібліотеку під назвою libnamespec.so перед тим, як шукати одну з назвах libnamespec.a ... Зауважте, що ця поведінка не стосується: імені файлу , який завжди вказує файл, який називається ім'ям файлу. " Оскільки 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

13
Зв'язування (і пошук dyn / статичних лібсів) здійснюється лінкером. Отже, ви повинні використовувати параметри Linker. -lі -Lє також варіантами сполучення.
osgx

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.