Копирование скомпилированных двоичных файлов на другой компьютер с помощью Flash Drive

Это может быть глупым вопросом, но если я скомпилирую совместно используемую библиотеку с использованием g ++ в одном дистрибутиве Linux, а затем перенесу эти библиотеки в виде объектных файлов через флэш-диск на другой компьютер с точно таким же дистрибутивом Linux и версией g ++, я все равно буду ли связать эти библиотеки в моих исходных файлах на втором компьютере?

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

3

Решение

Позвольте мне объяснить вам несколько примеров.

Предположим, у меня есть двоичный файл с именем 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]

(местоположение может отличаться на вашем компьютере). Как только вы отследите этот файл, вы можете связать его статически, как и раньше.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]