gpt4 book ai didi

c++ - 使用闪存驱动器将已编译的二进制文件复制到另一台机器

转载 作者:IT王子 更新时间:2023-10-29 01:14:59 26 4
gpt4 key购买 nike

这可能是个愚蠢的问题,但如果我在一个 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 上,我们可以通过(作为 super 用户)追踪它:

apt-file search libcgicc.a

现在,我们需要做的就是重新链接我们的程序,将-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++ –version 检查您使用的 g++ 版本,然后检查 libstdc++.a 在:

/usr/lib/gcc/[platform-name]/[version]

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

关于c++ - 使用闪存驱动器将已编译的二进制文件复制到另一台机器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23003507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com