Беспорядок о соединении библиотеки повышения, в то время как компиляция

Попробуйте эту команду:

$ reboot -f && exit
4
07.12.2013, 00:12
2 ответа

Вы не говорите, каково распределение Linux это, но часто времена, там каталог, где можно добавить динамично связываемые библиотеки. На дистрибутивах Redhat, таких как Fedora этот каталог здесь, /etc/ld.so.conf.d/.

LD

Можно добавить файл к этому каталогу с путем к недавно установленной библиотеке как так:

$ 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
...

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

Кэш LD

Можно всегда печатать содержание .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

Почему мой ldd производится все еще с помощью 1,53?

Это вызвано тем, что Ваш двоичный файл пользуется динамическими библиотеками. Таким образом, когда двоичный файл был скомпилирован, это было против 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 библиотека.

Я по упрощению этого и вероятно объяснению вещей немного прочь, но я только пытаюсь дать Вам общее представление о том, как механика того, как оборудование под капотом работает.

Ссылки

6
27.01.2020, 20:49

При компиляции программного обеспечения, которое пользуется динамическими библиотеками, если Вы твердый код RPATH в скомпилированный двоичный файл при выполнении исполняемого файла (или выполняет ldd против него), он не ищет библиотеки в определенных путях поиска для ОС (часто устанавливаемый в/etc/ld.so.conf).

Если Вы скомпилировали свое собственное программное обеспечение и установили его за пределами путей поиска библиотеки, необходимо будет скомпилировать двоичные файлы с трудно кодированным RPATH. Это сделано путем передачи-rpath компоновщику. Однако большую часть времени Ваш Make-файл не выполняет компоновщика непосредственно, необходимо сказать gcc передавать его компоновщику, обычно путем добавления -Wl,-rpath,/usr/local/whatever/lib к CFLAGS.

Если Вы не хотите к твердым путям выполнения кода, можно обновить Ваш $LD_LIBRARY_PATH переменная среды, чтобы иметь запятую разграничила набор каталогов библиотеки, которые Вы хотите предварительно ожидать к пути поиска библиотеки времени выполнения. Установка $LD_LIBRARY_PATH эфемерно, это ничего не делает к двоичному файлу, таким образом, необходимо было бы установить его любое время, необходимо выполнить исполняемый файл. (См. Модули Среды, если Вы хотите сделать это регулярным способом),

3
27.01.2020, 20:49

Теги

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