Почему libfoo.so работает, а libfoo.so.version - нет? - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть библиотека, которую я до сих пор собирал в объекты этой формы:

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.

1 Ответ

0 голосов
/ 11 апреля 2020

Было множество вещей, которые приводили к сбою:

В одном и том же каталоге находились и stati c, и общие библиотеки, поэтому по какой-то причине с новым именованием компилятор игнорировал новые имена общих библиотек и всегда связывались с библиотеками stati c (libalx-cv.so.1.0~b18 связывался с libalx-base.a вместо libalx-base.so.1.0~b18).

Я создал программные ссылки во время компиляции библиотеки, чтобы компоновщик может найти их:

libalx-module.so.1
libalx-module.so

Я также указал -L$(BUILD_SO_DIR) до -l alx-base (который мне раньше не требовался по неизвестной мне причине).

Там также может быть быть проблемой в файлах pkg-config: были дублирующие косые черты, которые могли неправильно интерпретироваться; например, после раскрытия переменных: -L/usr/local//lib//libalx/

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...