Вы не говорите, каково распределение Linux это, но часто времена, там каталог, где можно добавить динамично связываемые библиотеки. На дистрибутивах Redhat, таких как Fedora этот каталог здесь, /etc/ld.so.conf.d/
.
Можно добавить файл к этому каталогу с путем к недавно установленной библиотеке как так:
$ cat /etc/ld.so.conf.d/myboost.conf
/usr/local/lib/boost1.55
Затем выполните эту команду:
$ ldconfig -v
Это обработает все библиотеки и восстановит "кэш", /etc/ld.so.cache
. Этот кэш - то, что используется для определения местоположения библиотек, когда они указаны как так: -lboost_thread-mgw46-mt-sd-1_54
.
$ ldconfig -v
/usr/lib64/atlas:
libclapack.so.3 -> libclapack.so.3.0
libptcblas.so.3 -> libptcblas.so.3.0
libf77blas.so.3 -> libf77blas.so.3.0
libcblas.so.3 -> libcblas.so.3.0
liblapack.so.3 -> liblapack.so.3.0
libptf77blas.so.3 -> libptf77blas.so.3.0
libatlas.so.3 -> libatlas.so.3.0
/usr/lib64/wxSmithContribItems:
libwxflatnotebook.so.0 -> libwxflatnotebook.so.0.0.1
...
При добавлении путей к установке мне нравится подтверждать путем прохождения через этого вывода, чтобы удостовериться, что вещи становятся взятыми способ, к которому я ожидаю их.
Можно всегда печатать содержание .cache файла также с помощью этой команды:
$ ldconfig -p | head -10
2957 libs found in cache `/etc/ld.so.cache'
lib3ds-1.so.3 (libc6,x86-64) => /usr/lib64/lib3ds-1.so.3
libzvbi.so.0 (libc6,x86-64) => /usr/lib64/libzvbi.so.0
libzvbi-chains.so.0 (libc6,x86-64) => /usr/lib64/libzvbi-chains.so.0
libzrtpcpp-1.4.so.0 (libc6,x86-64) => /usr/lib64/libzrtpcpp-1.4.so.0
libzmq.so.1 (libc6,x86-64) => /usr/lib64/libzmq.so.1
libzmq.so (libc6,x86-64) => /usr/lib64/libzmq.so
libzipios.so.0 (libc6,x86-64) => /usr/lib64/libzipios.so.0
libzipios.so (libc6,x86-64) => /usr/lib64/libzipios.so
libzip.so.1 (libc6,x86-64) => /usr/lib64/libzip.so.1
Это вызвано тем, что Ваш двоичный файл пользуется динамическими библиотеками. Таким образом, когда двоичный файл был скомпилирован, это было против 1,55 версий библиотек. Однако, когда Вы опрашиваете двоичное использование ldd
, это в среде, это использует содержание .cache
файл. Так библиотека в кэше, который связан с символами, используемыми этим двоичным соответствием символы для 1,53, следовательно Вы видите те библиотеки.
Ваша среда не знает ничего из этих 1,55 библиотек, только Ваша среда сборки, т.е. Ваш Make-файл, знает об этом.
Думайте о функциях в них как символы. Символы являются именем, и таким образом, эти имена часто не изменяются от одной версии библиотеки другому. Таким образом, если необходимо было посмотреть на библиотеку, такую как повышение, можно использовать инструмент readelf
получить список символов в одном из них .so
файлы.
$ readelf -Ws /usr/lib64/libboost_date_time-mt.so | head -10
Symbol table '.dynsym' contains 261 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 000000335aa096a8 0 SECTION LOCAL DEFAULT 9
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt8bad_castD2Ev@GLIBCXX_3.4 (2)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND _ZNSt6locale5_ImplD1Ev@GLIBCXX_3.4 (2)
4: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND _ZTINSt6locale5facetE@GLIBCXX_3.4 (2)
5: 0000000000000000 0 FUNC GLOBAL DEFAULT UND wcslen@GLIBC_2.2.5 (3)
6: 0000000000000000 0 OBJECT GLOBAL DEFAULT UND _ZTISt11logic_error@GLIBCXX_3.4 (2)
В вышеупомянутом выводе Вы видите часть из FUNC
определения, это имена, которые используются для "связывания" функции в исполняемом файле с функцией от некоторых .so
библиотека.
Я по упрощению этого и вероятно объяснению вещей немного прочь, но я только пытаюсь дать Вам общее представление о том, как механика того, как оборудование под капотом работает.
При компиляции программного обеспечения, которое пользуется динамическими библиотеками, если Вы твердый код RPATH в скомпилированный двоичный файл при выполнении исполняемого файла (или выполняет ldd против него), он не ищет библиотеки в определенных путях поиска для ОС (часто устанавливаемый в/etc/ld.so.conf).
Если Вы скомпилировали свое собственное программное обеспечение и установили его за пределами путей поиска библиотеки, необходимо будет скомпилировать двоичные файлы с трудно кодированным RPATH
. Это сделано путем передачи-rpath компоновщику. Однако большую часть времени Ваш Make-файл не выполняет компоновщика непосредственно, необходимо сказать gcc передавать его компоновщику, обычно путем добавления -Wl,-rpath,/usr/local/whatever/lib
к CFLAGS
.
Если Вы не хотите к твердым путям выполнения кода, можно обновить Ваш $LD_LIBRARY_PATH
переменная среды, чтобы иметь запятую разграничила набор каталогов библиотеки, которые Вы хотите предварительно ожидать к пути поиска библиотеки времени выполнения. Установка $LD_LIBRARY_PATH
эфемерно, это ничего не делает к двоичному файлу, таким образом, необходимо было бы установить его любое время, необходимо выполнить исполняемый файл. (См. Модули Среды, если Вы хотите сделать это регулярным способом),