这可能是一个愚蠢的问题,但如果我在Linux的一个发行版上使用g ++编译共享库,然后将这些库作为目标文件通过闪存驱动器移动到具有完全相同的Linux发行版和g ++版本的另一台计算机,能够链接在第二台机器上的源文件中的这些库?
我在问,因为我没有在第二台机器上编译之前安装必要的库的权限,所以在我自己的计算机上编译它们并将其通过闪存驱动器上传到第二台机器
让我以一些例子来解释你。
假设我有我的机器X
二进制命名myapp
,我想在另一台机器运行它,但是当我运行然后它显示我一些错误
./myapp: error while loading shared libraries: libcgicc.so.5: cannot open shared object file: No such file or directory
这意味着我正在使用不在另一台机器上的库。 当然,我可以尝试在Y上安装所有相同的库,但是我没有权限去做。 那么我们的选择是静态链接我们的程序库。
在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
我们的程序,用/usr/lib/libcgicc.a
替换-lcgicc
。 现在,当我们在任一台机器上执行ldd myapp
时,我们没有更多的缺失库。
但是,这并不能保证所有的库都是完全一样的版本。 一个常见的问题是用于C ++代码的libstdc++
。 如果在尝试运行代码时看到如下消息:
./myapp: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9′ not found (required by ./myapp)
那么你有一个版本不匹配。 这可以通过静态链接libstdc ++库来解决 。 用g++ –version
检查你使用的是什么版本的g++
,然后检查libstdc++.a
in:
/usr/lib/gcc/[platform-name]/[version]
(您的计算机上的位置可能不同)。 一旦你跟踪这个文件,你可以像以前一样静态链接它。