运行从 Ubuntu 到 Debian 的可执行文件
Posted
技术标签:
【中文标题】运行从 Ubuntu 到 Debian 的可执行文件【英文标题】:Run an executable from Ubuntu to Debian 【发布时间】:2015-04-03 19:45:43 【问题描述】:我有一个 C++ 项目,但我的数据只是 too big 用于我的计算机。所以,我尝试在我们实验室的桌面上构建我的项目,但编译器太旧(4.3.5,我开发代码时有 4.8.1)。
我没有升级的权利,有权利的人这段时间对我来说太忙了。此外,他们对我说,实验室桌面运行的 Debian 版本太旧,因此无法对编译器进行重大升级。
所以我希望能够以某种方式设法将我在 Ubuntu 中创建的可执行文件复制到使用 Debian 的桌面并运行它。但我怕我问得太多了,所以否定的答案也是可以接受的。
我的电脑(创建可执行文件的地方):
samaras@samaras-A15:~$ uname -a
Linux samaras-A15 3.8.0-29-generic #42~precise1-Ubuntu SMP Wed Aug 14 15:31:16 UTC 2013 i686 i686 i386 GNU/Linux
samaras@samaras-A15:~$ lsb_release -d
Description: Ubuntu 12.04.3 LTS
实验室计算机和我运行可执行文件时会发生什么:
gsamaras@geomcomp:~/Desktop/code$ uname -a
Linux geomcomp 3.2.0-1-amd64 #1 SMP Fri Feb 17 05:17:36 UTC 2012 x86_64 GNU/Linux
gsamaras@geomcomp:~/Desktop/code$ lsb_release -d
Description: Debian GNU/Linux 6.0.10 (squeeze)
gsamaras@geomcomp:~/Desktop/code$ ./rkd_sam
./rkd_sam: /usr/lib32/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by ./rkd_sam)
./rkd_sam: /usr/lib32/libstdc++.so.6: version `GLIBCXX_3.4.17' not found (required by ./rkd_sam)
./rkd_sam: /usr/lib32/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by ./rkd_sam)
我有希望,因为它们都是 Linux 系统,但是 32 位和 64 位可能是个问题...:/
使用-static
标志,我得到的错误更少,但仍然......
gsamaras@geomcomp:~/Desktop/code$ ./rkd_sam
./rkd_sam: /usr/lib32/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by ./rkd_sam)
./rkd_sam: /usr/lib32/libstdc++.so.6: version `GLIBCXX_3.4.19' not found (required by ./rkd_sam)
依赖项是(在我的电脑上):
samaras@samaras-A15:~/parallel/rkd_forest/code$ ldd rkd_sam
linux-gate.so.1 => (0xb76f8000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb75e9000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb75bd000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb759e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb73f4000)
/lib/ld-linux.so.2 (0xb76f9000)
我得到了
which libstdc++
在实验室计算机上什么都没有打印,所以这意味着游戏结束了?
【问题讨论】:
你的项目在github.com上是免费软件吗? 没有,但是它有一个下载页面并且是开源的。为什么? @BasileStarynkevitchwhich libstdc++
无关紧要:which
只查找可执行文件,而不是库。你在 geomcomp 上确实有 libstdc++,问题是它与你的可执行文件不兼容,因为你的可执行文件需要一个 libstdc++ 版本,它需要比 geomcomp 更新的 glibc 版本。
因为如果您使用代码的超链接编辑您的问题,我们可能会提供更多帮助...
我明白了,Basile Starynkevitch 明天我将编辑我的帖子并通知您并查看 cmets/answers。谢谢@Gilles,这是有道理的,但我不确定我想用ldd
做什么。
【参考方案1】:
我们不知道您正在编写什么样的程序,所以这只是一个疯狂的猜测。
您的机器是 32 位 Intel,因此您的二进制文件是 ia32(即 x86 32 位)二进制文件。因此,您将始终受到地址空间的限制(实际上最多 2.5 到 3GB 的数据)。
Yoru 实验室的机器是运行旧版本 Linux 的 64 位 Intel
你可以尝试通过静态链接在你的机器上编译(所以g++ -static
在编译和链接时,即make -f Makefile_sam_par clean
然后make -f Makefile_sam_par CXX='g++ -static'
)
顺便说一句,您的Makefile_sam_par
是错误的,您应该在其中使用CXX
而不是CC
(因为常规 CXX
和CXXFLAGS
用于C++,运行make -p
到获取make
中的内置规则以了解详细信息,并阅读documentation of GNU make), 。所以先纠正一下。见this example。
如果您准备好花几天的时间工作,并且实验室桌面上有大量可用磁盘空间(例如 15 GB),您可能会尝试编译最近的 binutils 和最近的 GCC 4.9 编译器(一定要....../configure --prefix=$HOME/soft --program-suffix=-my-4.9
);这可能不值得努力。
也许可以尝试请朋友(拥有比您更大的笔记本电脑,Linux 64 位和超过 4Gb RAM)来运行您的程序。
顺便说一句,如果您的笔记本电脑有超过 4GB 的 RAM 和一些 x86-64 处理器(这在当今非常普遍,除了上网本),安装 64 位变体绝对值得Linux。
【讨论】:
您想了解我的程序的哪些信息?它是 C++,使用来自 STL 的向量、堆等。我的数据大小为 2.6 GB。你是怎么找到号码的?我现在就试试,但你的意思是g++
对吧?
2.5 到 3GB 的限制适用于您的整个过程。不仅是为了数据。所以它可能不适合。
你也可以用ldd
列出库依赖,将它们全部复制到可执行文件所在的目录,然后用LD_LIBRARY_PATH=. ./yourprogram
运行它
@G.Samaras 当我建议复制文件时,我的意思是从您的源系统复制它们。不是来自目标系统,我们试图避免其库。
好吧,我在我的电脑上做了ldd
。然后我不确定你想让我做什么。我明天会回来查看 cmets/answer,我现在真的需要上路了,谢谢。【参考方案2】:
您还没有说您的 PC 是哪种物理机器。如果它是最近的东西(除了非常小的上网本),你最好的选择可能是将内核切换到“amd64”变体,然后使用 C++ 编译器的“-m64”标志在你的机器上编译和运行代码以获得 64 位可执行文件。
我正在输入的这台机器有这样的设置,32 位用户空间、64 位内核和一些 64 位程序。
【讨论】:
以上是关于运行从 Ubuntu 到 Debian 的可执行文件的主要内容,如果未能解决你的问题,请参考以下文章