运行从 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上是免费软件吗? 没有,但是它有一个下载页面并且是开源的。为什么? @BasileStarynkevitch which 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(因为常规 CXXCXXFLAGS 用于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 的可执行文件的主要内容,如果未能解决你的问题,请参考以下文章

在 Ubuntu 上运行 Qt 创建的可执行文件时出错

从源代码与 deb 包编译

统信 Deepin为什么要摆脱Ubuntu和Debian?

QProcess 附加到从脚本运行的可执行文件

ubuntu DEBIAN_FRONTEND环境变量用法

ubuntu的2运行级别!