使用Flash Drive将已编译的二进制文件复制到另一台计算机

imk*_*dal 4 c++ linux flash g++ object-files

这可能是一个愚蠢的问题,但如果我在Linux的一个发行版上使用g ++编译共享库,然后将这些库作为目标文件通过闪存驱动器移动到具有完全相同的Linux发行版和g ++版本的另一台计算机,我仍然会能够在第二台机器上的源文件中链接这些库吗?

我问,因为我没有权限在第二台机器上编译之前安装必要的库,所以我更容易在我自己的计算机上编译它们并通过闪存驱动器上传编译的目标文件第二台机器

Jay*_*hoi 5

让我用一些例子来解释你.

假设myapp我的机器中有二进制命名,我X想在另一台机器上运行,Y但是当我运行时,它会显示一些错误

./myapp: error while loading shared libraries: libcgicc.so.5: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

这意味着我正在使用不在另一台机器上的库.当然,我可以尝试在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)
Run Code Online (Sandbox Code Playgroud)

让我们回到我们的编译机器,机器X,看看ldd myapplibcgicc的用途:

libcgicc.so.5 => /usr/lib/libcgicc.so.5 (0xb7f18000)
Run Code Online (Sandbox Code Playgroud)

所以在机器上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
Run Code Online (Sandbox Code Playgroud)

所以有一个静态版本,libcgicc.a.如果没有.a版本,我们需要获得一个 - debian/ubuntu我们可以通过执行(作为超级用户)来跟踪它:

apt-file search libcgicc.a
Run Code Online (Sandbox Code Playgroud)

现在,我们需要做的就是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)
Run Code Online (Sandbox Code Playgroud)

然后你的版本不匹配.这可以通过静态链接libstdc ++库来修复.检查g++您使用的是哪个版本g++ –version,然后检查libstdc++.a:

/usr/lib/gcc/[platform-name]/[version]
Run Code Online (Sandbox Code Playgroud)

(您的计算机上的位置可能不同).跟踪此文件后,您可以像以前一样静态链接它.