У меня есть библиотека, которую я до сих пор собирал в объекты этой формы:
libalx-module.so
Я даже не знал о soname и обо всем этом, поэтому я делал это просто. Все работало.
Теперь я перешел на эту схему (сейчас версия 1.0~b18
):
libalx-module.so.1.0~b18
libalx-module.so.1 # which is a symlink to the above file
Как видите, файла /^*.so$/
нет; У всех файлов есть что-то после .so
Предположительно, о них знает компоновщик:
$ ls -l /usr/local/lib/libalx/
total 4000
-rw-r--r-- 1 root root 1174626 Apr 9 10:55 libalx-base.a
lrwxrwxrwx 1 root root 22 Apr 9 10:55 libalx-base.so.1 -> libalx-base.so.1.0~b18
-rwxr-xr-x 1 root root 148416 Apr 9 10:55 libalx-base.so.1.0~b18
-rw-r--r-- 1 root root 113738 Apr 9 10:55 libalx-curl.a
lrwxrwxrwx 1 root root 22 Apr 9 10:55 libalx-curl.so.1 -> libalx-curl.so.1.0~b18
-rwxr-xr-x 1 root root 27112 Apr 9 10:55 libalx-curl.so.1.0~b18
-rw-r--r-- 1 root root 1122710 Apr 9 10:55 libalx-cv.a
lrwxrwxrwx 1 root root 20 Apr 9 10:55 libalx-cv.so.1 -> libalx-cv.so.1.0~b18
-rwxr-xr-x 1 root root 162272 Apr 9 10:55 libalx-cv.so.1.0~b18
-rw-r--r-- 1 root root 178620 Apr 9 10:55 libalx-data-structures.a
lrwxrwxrwx 1 root root 33 Apr 9 10:55 libalx-data-structures.so.1 -> libalx-data-structures.so.1.0~b18
-rwxr-xr-x 1 root root 36976 Apr 9 10:55 libalx-data-structures.so.1.0~b18
-rw-r--r-- 1 root root 106816 Apr 9 10:55 libalx-gmp.a
lrwxrwxrwx 1 root root 21 Apr 9 10:55 libalx-gmp.so.1 -> libalx-gmp.so.1.0~b18
-rwxr-xr-x 1 root root 25032 Apr 9 10:55 libalx-gmp.so.1.0~b18
-rw-r--r-- 1 root root 203048 Apr 9 10:55 libalx-gsl.a
lrwxrwxrwx 1 root root 21 Apr 9 10:55 libalx-gsl.so.1 -> libalx-gsl.so.1.0~b18
-rwxr-xr-x 1 root root 39304 Apr 9 10:55 libalx-gsl.so.1.0~b18
-rw-r--r-- 1 root root 115888 Apr 9 10:55 libalx-ncurses.a
lrwxrwxrwx 1 root root 25 Apr 9 10:55 libalx-ncurses.so.1 -> libalx-ncurses.so.1.0~b18
-rwxr-xr-x 1 root root 41952 Apr 9 10:55 libalx-ncurses.so.1.0~b18
-rw-r--r-- 1 root root 10054 Apr 9 10:55 libalx-ocr.a
lrwxrwxrwx 1 root root 21 Apr 9 10:55 libalx-ocr.so.1 -> libalx-ocr.so.1.0~b18
-rwxr-xr-x 1 root root 16736 Apr 9 10:55 libalx-ocr.so.1.0~b18
-rw-r--r-- 1 root root 61370 Apr 9 10:55 libalx-plot.a
lrwxrwxrwx 1 root root 22 Apr 9 10:55 libalx-plot.so.1 -> libalx-plot.so.1.0~b18
-rwxr-xr-x 1 root root 26632 Apr 9 10:55 libalx-plot.so.1.0~b18
-rw-r--r-- 1 root root 165356 Apr 9 10:55 libalx-robot.a
lrwxrwxrwx 1 root root 23 Apr 9 10:55 libalx-robot.so.1 -> libalx-robot.so.1.0~b18
-rwxr-xr-x 1 root root 31840 Apr 9 10:55 libalx-robot.so.1.0~b18
-rw-r--r-- 1 root root 12806 Apr 9 10:55 libalx-telnet-tcp.a
lrwxrwxrwx 1 root root 28 Apr 9 10:55 libalx-telnet-tcp.so.1 -> libalx-telnet-tcp.so.1.0~b18
-rwxr-xr-x 1 root root 16544 Apr 9 10:55 libalx-telnet-tcp.so.1.0~b18
-rw-r--r-- 1 root root 9574 Apr 9 10:55 libalx-zbar.a
lrwxrwxrwx 1 root root 22 Apr 9 10:55 libalx-zbar.so.1 -> libalx-zbar.so.1.0~b18
-rwxr-xr-x 1 root root 16816 Apr 9 10:55 libalx-zbar.so.1.0~b18
drwxr-xr-x 2 root root 4096 Apr 9 10:55 py
drwxr-xr-x 2 root root 4096 Apr 9 10:55 sh
$ sudo ldconfig -v
ldconfig: Can't stat /usr/local/lib/x86_64-linux-gnu: No such file or directory
ldconfig: Path `/usr/lib/x86_64-linux-gnu' given more than once
ldconfig: Path `/lib/x86_64-linux-gnu' given more than once
ldconfig: Path `/usr/lib/x86_64-linux-gnu' given more than once
ldconfig: Path `/usr/lib' given more than once
/usr/lib/x86_64-linux-gnu/libfakeroot:
libfakeroot-0.so -> libfakeroot-tcp.so
/usr/local/lib/libalx:
libalx-cv.so.1 -> libalx-cv.so.1.0~b18
libalx-telnet-tcp.so.1 -> libalx-telnet-tcp.so.1.0~b18
libalx-gmp.so.1 -> libalx-gmp.so.1.0~b18
libalx-base.so.1 -> libalx-base.so.1.0~b18
libalx-gsl.so.1 -> libalx-gsl.so.1.0~b18
libalx-ocr.so.1 -> libalx-ocr.so.1.0~b18
libalx-ncurses.so.1 -> libalx-ncurses.so.1.0~b18
libalx-zbar.so.1 -> libalx-zbar.so.1.0~b18
libalx-plot.so.1 -> libalx-plot.so.1.0~b18
libalx-curl.so.1 -> libalx-curl.so.1.0~b18
libalx-robot.so.1 -> libalx-robot.so.1.0~b18
libalx-data-structures.so.1 -> libalx-data-structures.so.1.0~b18
[...]
Но компиляция (на самом деле сбой компоновки; компиляция работает) программ, которые зависят от этой библиотеки не удается (только для некоторых программ, что делает его еще более странным). Я использую файлы pkg-config, поэтому флаги во всех программах одинаковы.
Не удается найти символы не в моей библиотеке, а не найти символы других библиотек, от которых зависит моя библиотека (для одного из модулей):
$ objdump -x /usr/local/lib/libalx/libalx-cv.so.1
[...]
Dynamic Section:
NEEDED libopencv_highgui.so.4.2
NEEDED libopencv_videoio.so.4.2
NEEDED libopencv_ximgproc.so.4.2
NEEDED libopencv_calib3d.so.4.2
NEEDED libopencv_imgcodecs.so.4.2
NEEDED libopencv_features2d.so.4.2
NEEDED libopencv_imgproc.so.4.2
NEEDED libopencv_core.so.4.2
NEEDED libgsl.so.23
NEEDED libstdc++.so.6
NEEDED libm.so.6
NEEDED libgcc_s.so.1
NEEDED libc.so.6
SONAME libalx-cv.so.1
[...]
Ошибка:
/usr/bin/ld: /tmp/laundry-symbol-reader.xKItRp.ltrans0.ltrans.o: in function `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<std::allocator<char> >(char const*, std::allocator<char> const&) [clone .constprop.0]':
<artificial>:(.text+0x1ab): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_create(unsigned long&, unsigned long)'
/usr/bin/ld: /tmp/laundry-symbol-reader.xKItRp.ltrans0.ltrans.o: in function `alx_cv_conts_largest_p.constprop.0':
<artificial>:(.text+0x273): undefined reference to `cv::arcLength(cv::_InputArray const&, bool)'
/usr/bin/ld: /tmp/laundry-symbol-reader.xKItRp.ltrans0.ltrans.o: in function `alx_cv_adaptive_thr.constprop.0':
<artificial>:(.text+0x32f): undefined reference to `cv::adaptiveThreshold(cv::_InputArray const&, cv::_OutputArray const&, double, int, int, int, double)'
/usr/bin/ld: /tmp/laundry-symbol-reader.xKItRp.ltrans0.ltrans.o: in function `alx_cv_smooth.constprop.0':
<artificial>:(.text+0x39d): undefined reference to `cv::medianBlur(cv::_InputArray const&, cv::_OutputArray const&, int)'
/usr/bin/ld: /tmp/laundry-symbol-reader.xKItRp.ltrans0.ltrans.o: in function `alx_cv_clone':
<artificial>:(.text+0x3e3): undefined reference to `cv::Mat::copyTo(cv::_OutputArray const&) const'
/usr/bin/ld: /tmp/laundry-symbol-reader.xKItRp.ltrans0.ltrans.o: in function `cv::Mat::release()':
<artificial>:(.text+0x446): undefined reference to `cv::Mat::deallocate()'
/usr/bin/ld: /tmp/laundry-symbol-reader.xKItRp.ltrans0.ltrans.o: in function `cv::Mat::~Mat()':
<artificial>:(.text+0x4c0): undefined reference to `cv::fastFree(void*)'
/usr/bin/ld: <artificial>:(.text+0x4e1): undefined reference to `cv::Mat::deallocate()'
/usr/bin/ld: /tmp/laundry-symbol-reader.xKItRp.ltrans0.ltrans.o: in function `alx_cv_component.constprop.0':
<artificial>:(.text+0x610): undefined reference to `cv::fastFree(void*)'
/usr/bin/ld: <artificial>:(.text+0x647): undefined reference to `cv::Mat::deallocate()'
/usr/bin/ld: <artificial>:(.text+0x65a): undefined reference to `cv::split(cv::Mat const&, cv::Mat*)'
/usr/bin/ld: <artificial>:(.text+0x685): undefined reference to `cv::Mat::copyTo(cv::_OutputArray const&) const'
/usr/bin/ld: <artificial>:(.text+0x701): undefined reference to `cv::Mat::deallocate()'
[...]
Пример файла конфигурации pkg:
$ cat /usr/local/lib/pkgconfig/libalx-cv.pc
Name: libalx-cv
Description: The libalx C/C++ library (openCV extension)
URL: https://github.com/alejandro-colomar/libalx
Version: 1.0~b18
Requires:
Requires.private: opencv4 libalx-base libalx-gsl
prefix=/usr/local/
includedir=${prefix}/include/
libdir=${prefix}/lib/
Cflags: -I${includedir} -D_GNU_SOURCE -D_POSIX_C_SOURCE=200809L
Libs: -L${libdir}/libalx/ -lalx-cv
Libs.private: -lm -lstdc++
Любопытно, что он не может найти только символы C ++ и находит все символы C.
Я обнаружил, что C программы, зависящие от символов C, компилируются.
C ++ программы компилируются.
Но C программы, которые зависят от символов C ++, терпят неудачу.
После этого все работает, но я не понимаю, почему:
sudo cp libalx-cv.so.1.0~b18 libalx-cv.so
Другой обходной путь - переместить все приватные библиотеки и требует в pkg-config не частные. Но я думаю, что это не нужно.
Система:
$ uname -a
Linux ADY-debian-11 5.4.0-4-amd64 #1 SMP Debian 5.4.19-1 (2020-02-13) x86_64 GNU/Linux
$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux bullseye/sid"
NAME="Debian GNU/Linux"
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
$ gcc --version
gcc (Debian 9.3.0-8) 9.3.0
Copyright (C) 2019 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ ld --version
GNU ld (GNU Binutils for Debian) 2.34
Copyright (C) 2020 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License version 3 or (at your option) a later version.
This program has absolutely no warranty.