这可能是一个愚蠢的问题,但如果我在Linux的一个发行版上使用g编译共享库,然后将这些库作为目标文件通过闪存驱动器移动到具有完全相同的Linux发行版和g版本的另一台计算机,我仍然会能够在第二台机器上的源文件中链接这些库吗?
我问,因为我没有权限在第二台机器上编译之前安装必要的库,所以我更容易在我自己的计算机上编译它们并通过闪存驱动器上传编译的目标文件第二台机器
解决方法:
让我用一些例子来解释你.
假设我的机器X中有二进制名为myapp,我想在另一台机器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
现在,我们需要做的就是重新链接我们的程序,用/usr/lib/libcgicc.a替换-lcgicc.现在,当我们在任一台机器上执行ldd myapp时,我们不再缺少库.
但是,这并不能保证所有库都是完全相同的版本.一个常见的问题是libstdc用于C代码.如果您在尝试运行代码时看到类似这样的消息:
./myapp: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9′ not found (required by ./myapp)
然后你的版本不匹配.这可以在statically linking the libstdc++ library之前修复.使用g -version检查您正在使用的g版本,然后在以下位置检查libstdc .a:
/usr/lib/gcc/[platform-name]/[version]
(您的计算机上的位置可能不同).跟踪此文件后,您可以像以前一样静态链接它.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。