Принесите извинения, потому что в настоящий момент у меня нет среды, чтобы экспериментировать и разобраться в следующих вопросах самого:
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
. Разве это не было бы неудобно, если программа работает на системе без точной версии библиотеки? Каков мог быть практический способ обработать версию в то время как пользующаяся общая библиотека?
Согласно руководству,
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.