Вопросы на компоновщике GCC

Принесите извинения, потому что в настоящий момент у меня нет среды, чтобы экспериментировать и разобраться в следующих вопросах самого:

1) Скажем, у меня есть четыре файла библиотеки: libmylib_super.a и libmylib_super.so, mylib_dumb.a и mylib_dumb.so. При определении библиотек для соединения с, что является различиями между следующими подходами:

A) -l:libmylib_super.a
B) -llibmylib_super
C) -lmylib_super
D) -lmylib_dumb

2) Определение -static из страницы справочника:

В системах, которые поддерживают динамическое подключение, это предотвращает соединение с общими библиотеками. В других системах эта опция не имеет никакого эффекта.

Эта опция компоновщика имеет какое-либо отношение к вопросу № 1? Или... случайно они вмешаются друг в друга?

Спасибо.

---отредактированный 28.12.2009---

Я просто разбудил свою среду и экспериментирующий немного путем соединения для Повышения date_time библиотеки. Скажите, что у меня есть три файла библиотеки: libboost_date_time-mt-d.a, libboost_date_time-mt-d.so.1.41.0, libboost_date_time-mt-d.so -> libboost_date_time-mt-d.so.1.41.0 (символьная ссылка).

1) -l:libboost_date_time-mt-d.a ==> соединение хорошо, двоичный файл работает даже без файла библиотеки.
2) -l:libboost_date_time-mt-d.a с -static ==> соединение ошибки /usr/bin/ld: cannot find -lm

C.1) -lboost_date_time-mt-d ==> соединение хорошо, двоичный файл работает, но требует совместно использованного файла библиотеки.
C.2) -lboost_date_time-mt-d с -static ==> соединение ошибки /usr/bin/ld: cannot find -lm

Какая-либо идея об ошибке в 2 и C.2?

Кроме того, при запущении программы в C.1, это кажется поиском совместно использованного файла библиотеки с именем libboost_date_time-mt-d.so.1.41.0 но не libboost_date_time-mt-d.so. Разве это не было бы неудобно, если программа работает на системе без точной версии библиотеки? Каков мог быть практический способ обработать версию в то время как пользующаяся общая библиотека?

5
задан shiouming 28 December 2009 в 04:48
поделиться

1 ответ

Согласно руководству,

A) ищет путь библиотеки для файла с точным именем libmylib_super.a (поиск сначала для поведения общей библиотеки не применяется)

B) ищет путь библиотеки для файла с именем liblibmylib_super. поэтому сначала liblibmylib_super.a или только ищет файл с именем liblibmylib_super. a, если используется -статик -- обратите внимание, что именно компоновщик, добавляющий префикс lib и расширение файла

C), ищет путь к файлу с именем liblibmylib_super. поэтому сначала libmylib_super.a или только ищет файл с именем liblibmylib_super. поэтому, если используется -статический, см. C)

Обратите внимание, что B) не будет работать, потому что именно компоновщик должен добавить префикс lib к имени библиотеки.

Обратите внимание, что D) не будет работать, потому что ваш mylib_dumb не следует соглашению об именовании.

См. GNU Linker Manual:

-l namespec

--library=namespec

Добавьте архив или объектный файл, указанный namespec, в список файлов для компоновки. Данная опция может быть использована любое количество раз. Если namespec имеет форму :filename, то ld будет искать путь к библиотеке для файла с именем файла, иначе он будет искать путь к библиотеке для файла с именем libnamespec.a.

В системах, поддерживающих общие библиотеки, ld также может искать файлы, отличные от libnamespec.a. В частности, в системах ELF и SunOS, ld будет искать каталог для библиотеки с именем libnamespec. Поэтому перед поиском одной из библиотек, называемой libnamespec.a. (По соглашению, расширение .so указывает на разделяемую библиотеку.) Обратите внимание, что такое поведение не распространяется на :имя файла, которое всегда указывает файл, называемый именем файла.

Линкер будет искать архив только один раз, в том месте, где он указан в командной строке. Если в архиве определен символ, который был неопределен в каком-то объекте, появившемся перед архивом в командной строке, компоновщик включит из архива соответствующий файл(ы). Однако, неопределенный символ в объекте, появившемся позже в командной строке, не повлечет за собой повторного поиска компоновщика в архиве.

Смотрите опцию -( способ заставить компоновщика искать в архиве несколько раз.

В командной строке можно перечислить один и тот же архив несколько раз.

Этот тип поиска в архиве является стандартным для компоновщиков Unix. Однако, если вы используете ld на AIX, обратите внимание, что он отличается от поведения компоновщика AIX.

9
ответ дан 14 December 2019 в 01:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: