Это может быть глупым вопросом, но если я скомпилирую совместно используемую библиотеку с использованием g ++ в одном дистрибутиве Linux, а затем перенесу эти библиотеки в виде объектных файлов через флэш-диск на другой компьютер с точно таким же дистрибутивом Linux и версией g ++, я все равно буду ли связать эти библиотеки в моих исходных файлах на втором компьютере?
Я спрашиваю, потому что у меня нет прав для установки необходимых библиотек перед компиляцией на втором компьютере, поэтому мне было бы проще просто скомпилировать их на своем компьютере и загрузить скомпилированные объектные файлы через флэш-диск на вторая машина
Позвольте мне объяснить вам несколько примеров.
Предположим, у меня есть двоичный файл с именем myapp
в моей машине X
и я хочу запустить его на другой машине Y
но когда я бегу, то это показывает мне какую-то ошибку, как
./myapp: error while loading shared libraries: libcgicc.so.5: cannot open shared object file: No such file or directory
Это означает, что я использую библиотеку, которой нет на другом компьютере. Конечно, я мог бы попытаться установить все те же библиотеки на Y, что и на X. Но у меня нет разрешения делать это. Тогда наша альтернатива — статически связать библиотеки с нашей программой.
На Y
, запустите команду ldd myapp
, Это даст что-то вроде:
libpthread.so.0 => /lib/tls/libpthread.so.0 (0xf7f77000)
libdl.so.2 => /lib/libdl.so.2 (0xf7f73000)
libgd.so.2 => /usr/lib/libgd.so.2 (0xf7f26000)
libcgicc.so.5 => not found <------------------------------------//this library missed
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0xf7f08000)
libpng12.so.0 => /usr/lib/libpng12.so.0 (0xf7ee4000)
Давайте вернемся к нашему компилятору, машине X
и посмотрим что ldd myapp
говорит там для libcgicc:
libcgicc.so.5 => /usr/lib/libcgicc.so.5 (0xb7f18000)
Так на машине X
библиотека, которую мы хотим, находится в / USR / Lib. Если мы делаем ls /usr/lib/libcgicc*
мы можем увидеть, какие версии этой библиотеки доступны. На машине это:
/usr/lib/libcgicc.a
/usr/lib/libcgicc.la
/usr/lib/libcgicc.so
/usr/lib/libcgicc.so.5
/usr/lib/libcgicc.so.5.0.1
Так что есть статическая версия,libcgicc.a
, Если бы не было .a
версия, нам нужно было бы получить один — на debian/ubuntu
мы могли бы отследить это, выполнив (как суперпользователь):
apt-file search libcgicc.a
Теперь все, что нам нужно сделать, это relink
наша программа, заменяющая -lcgicc
с /usr/lib/libcgicc.a
, Теперь, когда мы делаем ldd myapp
ни на одной машине у нас больше нет отсутствующих библиотек.
Однако это не гарантирует, что все библиотеки имеют одинаковую версию. Частая проблема libstdc++
для кода C ++. Если вы видите такое сообщение при попытке запустить ваш код:
./myapp: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9′ not found (required by ./myapp)
Тогда у вас несоответствие версии. Это может быть исправлено статическое связывание библиотеки libstdc ++. Проверьте, какая версия g++
вы используете с g++ –version
, а затем проверьте libstdc++.a
в:
/usr/lib/gcc/[platform-name]/[version]
(местоположение может отличаться на вашем компьютере). Как только вы отследите этот файл, вы можете связать его статически, как и раньше.
Других решений пока нет …