【问题标题】:I am unable to run a C++ program in Debian(Ubuntu) that works in Redhat(Centos)我无法在 Debian(Ubuntu) 中运行可在 Redhat(Centos) 中运行的 C++ 程序
【发布时间】: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 运行代码以捕获任何错误。
  • 你试过运行预编译的二进制文件吗?

标签: c++ ubuntu centos debian redhat


【解决方案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】:
      1. make all 作为自己的步骤,然后检查所有编译是否正常。
      2. 运行make tests,然后检查哪些测试失败。

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

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-06
        • 2016-02-23
        • 2018-08-09
        • 2023-03-19
        • 2022-01-16
        • 2013-02-23
        相关资源
        最近更新 更多