我无法在 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 容器中设置语言环境?