10

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

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

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

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

4

5 回答 5

6

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

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

while (!stream.eof() )

至:

while (stream)

并重新编译。

于 2013-04-19T21:17:22.770 回答
2

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

下面是一些用 GNU 编译包的 bash 脚本g++4.6

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
于 2013-04-24T01:03:42.737 回答
1
  1. make all按照自己的步骤执行,然后检查所有编译是否正常。
  2. 运行make tests,然后检查哪些测试失败。

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

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

于 2013-04-19T19:52:44.573 回答
1

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

任何像样的软件包都带有依赖项列表,您是否检查过这个并检查过要求是否存在?

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

于 2012-10-18T18:39:50.257 回答
0

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

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

于 2013-04-25T10:55:21.347 回答