这可能是一个愚蠢的问题,但是如果我在Linux的一个发行版上使用g ++编译共享库,然后将这些库作为目标文件通过闪存驱动器移动到具有完全相同的Linux发行版和g ++版本的另一台计算机将我仍然可以在第二台机器上的源文件中链接这些库吗?
我问,因为我没有权限在第二台机器上编译之前安装必要的库,所以我更容易在我自己的计算机上编译它们并通过上传编译的目标文件闪存驱动器到第二台机器
答案 0 :(得分:5)
让我用一些例子向你解释。
假设我的机器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
,然后看看{c}为libcgicc所说的ldd myapp
:
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
时,我们不再缺少库。
但是,这并不能保证所有库都是完全相同的版本。 C ++代码的常见问题是libstdc++
。如果您在尝试运行代码时看到类似这样的消息:
./myapp: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9′ not found (required by ./myapp)
然后你的版本不匹配。这可以通过statically linking the libstdc++ library来解决。检查您使用g++
的{{1}}版本,然后检查g++ –version
:
libstdc++.a
(您的计算机上的位置可能有所不同)。跟踪此文件后,您可以像以前一样静态链接它。