Що таке параметри командного рядка --start-group та --end-group?


83

Яка мета цих параметрів командного рядка? Будь ласка, допоможіть розшифрувати значення наступного командного рядка:

-Wl,--start-group -lmy_lib -lyour_lib -lhis_lib -Wl,--end-group -ltheir_lib

Очевидно, це має щось спільне із зв'язуванням, але в посібнику GNU тихо, що саме означає групування.

Відповіді:


95

Він призначений для вирішення кругових залежностей між кількома бібліотеками (переліченими між -(та -)).

Цитування Чому порядок зв’язку бібліотек іноді спричиняє помилки в GCC? або man ld http://linux.die.net/man/1/ld

-( архіви -) або --start-group архіви --end-group

В архівах повинні бути списком архівних файлів. Вони можуть бути як явними іменами файлів, так і параметрами -l.

Зазначені архіви здійснюють повторний пошук, поки не створюються нові невизначені посилання. Зазвичай архів шукається лише один раз у тому порядку, який вказано в командному рядку. Якщо символ у цьому архіві потрібен для розв'язання невизначеного символу, на який посилається об'єкт в архіві, що з'являється пізніше в командному рядку, компонувальник не зможе розпізнати це посилання. Групуючи архіви, їх усі шукають неодноразово, доки не будуть вирішені всі можливі посилання.

Використання цієї опції має значні витрати на продуктивність. Найкраще використовувати його лише тоді, коли між двома або більше архівами є невідворотні кругові посилання.

Отже, бібліотеки всередині групи можна шукати нові символи кілька разів, і вам не потрібні некрасиві конструкції типу -llib1 -llib2 -llib1

Архів PS означає в основному статичну бібліотеку ( *.aфайли)


1
Прийнято. Зауваження: Я вважаю, що GCC спочатку переходить до динамічних бібліотек, якщо в командному рядку не передано повне ім'я файлу (включаючи шлях та суфікс .a). -llib1 спричинив би спробу GCC спершу зв’язати файл% .so, а потім спробувати файл% .a.
pic11

1
@ pic11, дякую. Посилання здійснюється ld, і ви можете побачити, як здійснюється пошук бібліотек з додаванням -Wl,--verboseопції до gcc (вона перейде --verboseдо linker ld). Наприклад , для -ltestбібліотеки: attempt to open /lib/libtest.so failed \n attempt to open /lib/libtest.a failed \n attempt to open /usr/lib/libtest.so failed \n attempt to open /usr/lib/libtest.a failed \n . Linker спробуйте відкрити .soспочатку, але потім спробуйте відкрити .a. Це робиться у кожному каталозі в каталогах пошуку бібліотеки.
osgx

"кілька разів шукали нові символи"? Я думаю, що пошуку двічі достатньо, щоб вирішити всі символи. Це не повинно мати значних витрат на продуктивність.
Jimm Chen

9
Вибачте, я нарешті зрозумів, що "двічі шукати" недостатньо.
Jimm Chen
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.