Имена общих библиотек имеют расширение версии, которое не ищет компоновщик? - PullRequest
0 голосов
/ 25 марта 2020

У меня есть несколько общих библиотек, большинство из которых, я считаю, установлены с помощью пакетов Red Hat: ncurses, cap, uuid, xml2.

[root@mycomputer~]# rpm -ql libuuid-2.23.2-43.el7_4.2.x86_64
/usr/lib64/libuuid.so.1
/usr/lib64/libuuid.so.1.3.0
/usr/share/doc/libuuid-2.23.2
/usr/share/doc/libuuid-2.23.2/COPYING

> l /usr/lib64/*uuid*
-rwxr-xr-x. 1 root root 20040 Nov  9  2017 /usr/lib64/libuuid.so.1.3.0
lrwxrwxrwx. 1 root root    16 Jul  3  2018 /usr/lib64/libuuid.so.1 -> libuuid.so.1.3.0

Файл сборки примера программы производителя содержит -luuid в строке ссылки, и компоновщик жалуется:

/usr/bin/ld: cannot find -luuid

Я запускаю strace -f make ... >& makeout, чтобы перехватить все системные вызовы, сделанные make и его дочерними процессами. -f означает «следуйте также за дочерними процессами».)

Когда я выполняю поиск этого файла для строки uuid, я вижу, что он никогда не ищет файл с расширением .1 .

[pid 21920] open("/opt/nmr/sap/sybaseASE/sybclient-16.0.3-7/OCS-16_0/lib/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/opt/nmr/sap/sybaseASE/sybclient-16.0.3-7/OCS-16_0/lib/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../../lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib/../lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib/../lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/../lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/../lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/gcc/x86_64-redhat-linux/4.8.5/../../../libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/x86_64-redhat-linux/lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/x86_64-redhat-linux/lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/local/lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/local/lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib64/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib64/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/x86_64-redhat-linux/lib/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/x86_64-redhat-linux/lib/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/local/lib/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/local/lib/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/lib/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/libuuid.so", O_RDONLY) = -1 ENOENT (No such file or directory)
[pid 21920] open("/usr/lib/libuuid.a", O_RDONLY) = -1 ENOENT (No such file or directory)

Я понимаю механизм мягкой ссылки из файла, подобного /usr/lib64/libuuid.so (без суффикса .1), на указанную c версию, скажем, libuuid.so.1.3.0. readlink(), я полагаю, чтобы найти окончательный файл, на который указывает libuuid.so, и встроить цель этой ссылки libuuid.so.1.3.0 в двоичный файл. Таким образом, даже если «последняя» версия uuid в будущем станет 1.4.0 и libuuid.so будет перенаправлена ​​на эту новую версию, например, этот двоичный файл все равно будет связан с 1.3.0 во время выполнения.

Но как компилятор должен получить от libuuid.so до libuuid.so.1?

1 Ответ

3 голосов
/ 25 марта 2020

вам нужно установить libuuid-devel, который содержит:

/usr/lib64/libuuid.so -> libuuid.so.1.3.0

и файлы заголовков, которые вам, вероятно, нужны.

После компиляции ваш двоичный файл знает, что он был собран с libuuid.so.1, поэтому при исполнении ему не понадобятся libuuid.so, а libuuid.so.1 ...

...