我无法在 Debian(Ubuntu) 中运行可在 Redhat(Centos) 中运行的 C++ 程序

Posted

技术标签:

【中文标题】我无法在 Debian(Ubuntu) 中运行可在 Redhat(Centos) 中运行的 C++ 程序【英文标题】:I am unable to run a C++ program in Debian(Ubuntu) that works in Redhat(Centos) 【发布时间】:2012-10-09 07:20:21 【问题描述】:

TLDR:在 Ubuntu Debian 的 Centos Redhat 中编译 C++ 程序时遇到问题。在这两者之间我应该注意什么会使使用相同编译器编译的 C++ 程序不起作用?

您好,我正在尝试编译和运行 Germline (http://www1.cs.columbia.edu/~gusev/germline/)。它在 RedHat Centos 中运行良好,但是对于我切换的大多数东西,Centos 的支持不如 Ubuntu。现在这个程序不起作用。它完全有可能使用某种仅限 RedHat 的功能,但我使用相同的编译器 (g++) 在两种环境中编译它。

我一直在努力让这个东西在 Ubuntu 上工作,因为它更好用,但现在当我在 ubuntu 中“制作所有”项目时,它会编译和测试永远旋转(永远不要完成)。无论我使用什么二进制文件(在 Centos 中编译并复制,我刚才提到的失败的测试二进制文件等),程序总是会冻结。

有点长,抱歉。我的主要问题是:我可以尝试其他 C++ 编译器替代方案吗?是否有任何我可能缺少的 Red-hat C++ 库。或者可能导致这种情况的 C++ 实现的主要差异?

【问题讨论】:

为了让我们帮助您,您必须至少提供 G++ 编译器给您的错误。 当您说“相同的编译器”时,您使用的是相同版本的 g++ 吗?两台机器上的配置输出是什么样的? 我也遇到过类似的情况,尽管是在 Windows 和 Linux 上。可能是您的代码依赖于某种未定义的行为才能正常运行,并且无论出于何种原因,这种行为只发生在 Red Hat Linux 上。我的建议是使用调试符号编译并通过 Valgrind 运行代码以捕获任何错误。 你试过运行预编译的二进制文件吗? 【参考方案1】:

我看了一下软件。它的输入代码有点脆弱,我不确定 Ubuntu 或 Red Hat 的 C++ 库在这种情况下是否有问题,但该程序可以很容易地修复以在两者上运行。

在文件PEDIndividualsExtractor.cpp,函数void PEDIndividuasExtractor::loadInput()中,改行:

while (!stream.eof() )

到:

while (stream)

然后重新编译。

【讨论】:

【参考方案2】:

使用while(!stream.eof()) 是一个常见错误。如果语句stream.eof() 为真,则不一定意味着对流的最后一次操作成功。

这里有几个用 GNU g++4.6 编译包的 bash 脚本:

wget http://www1.cs.columbia.edu/~gusev/germline/germline-1-5-1.tar.gz
tar -xzvf germline-1-5-1.tar.gz
cd germline-1-5-1/
perl -p -i.bak -e's/!stream\.eof\(\)/stream/g' PEDIndividualsExtractor.cpp
perl -p -i.bak -e's/!stream_sample.eof\(\)/stream_sample/g' HMIndividualsExtractor.cpp
make all
cat test/generated.out

【讨论】:

您的脚本非常方便实用,谢谢!【参考方案3】:

您应该指定第一个错误的真正含义,您没有提供足够的信息来说明问题所在,但是我猜想缺少依赖项。

任何像样的包都带有一个依赖列表,你检查过这个并检查过需求吗?

在没有需求和依赖列表的情况下,在这种情况下一个好的经验法则是检查第一个错误是什么并修复它。例如,如果第一个错误显示“缺少傻瓜.h”,那么您需要为该机器安装“傻瓜”。

【讨论】:

【参考方案4】:
    make all 作为自己的步骤,然后检查所有编译是否正常。 运行make tests,然后检查哪些测试失败。

这些是您的第一步,可能会帮助您完成大部分工作。

正如 PenguinCoder 上面所说,您需要检查 Ubuntu 和 Redhat 之间的编译器版本是否相同。每次在gcc 进行大版本升级时,我都会遇到一些(小)问题。

【讨论】:

【参考方案5】:

如果只需要在 Ubuntu 上使用该程序,可以将程序配置为--static 编译成静态可执行文件,然后将可执行文件复制到 Ubuntu。

或者,您可以使用ldd 命令找出动态可执行文件链接到的.so 文件,并将这些.so 文件复制到动态可执行文件的同一目录下,然后放到Ubuntu 上运行。您也可以将.so文件放在另一个目录中,并使用LD_LIBRARY_PATH帮助可执行文件找到.so文件。

【讨论】:

做到了,这就是我得到的地方:unix.stackexchange.com/questions/169754/…

以上是关于我无法在 Debian(Ubuntu) 中运行可在 Redhat(Centos) 中运行的 C++ 程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Debian/Ubuntu Docker 容器中设置语言环境?

ubuntu上的分段错误,在debian上运行

基于debian/ubuntu的linux在非KDE桌面下okular无法读取pdf原因和解决方案

Linux debian ubuntu安装GIMP软件

Linux debian ubuntu安装GIMP软件

新手刚装好debian7.3遇到的问题