【问题标题】:Cannot execute .o file created by Netbeans无法执行 Netbeans 创建的 .o 文件
【发布时间】:2012-12-05 10:11:48
【问题描述】:

我在本地计算机上有一个项目,我想在服务器 (Debian) 上运行/调试 cppunit 测试。我使用 Netbeans 创建了 .o 文件并将权限设置为可执行。

drwxr-xr-x 2 myName myGroup   4096 18. Dec 08:40 .
drwxr-xr-x 3 myName myGroup   4096 18. Dec 08:40 ..
-rwxr-xr-x 1 myName myGroup 393488 18. Dec 08:40 SisyTestData.o
-rwxr-xr-x 1 myName myGroup   3127 18. Dec 08:40 SisyTestData.o.d
-rwxr-xr-x 1 myName myGroup  30016 18. Dec 08:40 SisyTestDataRunner.o
-rwxr-xr-x 1 myName myGroup    173 18. Dec 08:40 SisyTestDataRunner.o.d

如果我尝试从它所在的目录运行 ./SisyTestDataRunner 我会得到 ​​p>

bash: ./SisyTestDataRunner: Datei oder Verzeichnis nicht gefunden

(表示:未找到文件或目录)

如果我尝试运行 ./SisyTestDataRunner.o 我会得到

bash: ./SisyTestDataRunner.o: Kann die Datei nicht ausführen.

(意思是:不能执行文件)

SisyTestDataRunner 如下所示:

#include <cppunit/BriefTestProgressListener.h>
#include <cppunit/CompilerOutputter.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/TestResult.h>
#include <cppunit/TestResultCollector.h>
#include <cppunit/TestRunner.h>

int main() {
    // Create the event manager and test controller
    CPPUNIT_NS::TestResult controller;

    // Add a listener that colllects test result
    CPPUNIT_NS::TestResultCollector result;
    controller.addListener(&result);

    // Add a listener that print dots as test run.
    CPPUNIT_NS::BriefTestProgressListener progress;
    controller.addListener(&progress);

    // Add the top suite to the test runner
    CPPUNIT_NS::TestRunner runner;
    runner.addTest(CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest());
    runner.run(controller);

    // Print test in a compiler compatible format.
    CPPUNIT_NS::CompilerOutputter outputter(&result, CPPUNIT_NS::stdCOut());
    outputter.write();

    return result.wasSuccessful() ? 0 : 1;
}

文件 SisyTestData 包含一个测试用例,当我在本地计算机上启动它时它可以工作(但它在服务器上运行)。

一般情况下不可能从命令行运行由 netbeans 创建的文件吗?是不是必须直接在服务器上编译链接?

【问题讨论】:

  • 我认为你的问题基本上是:why does Netbeans not generate an executable file ?。一般不能执行对象 (.o) 文件。
  • .o 文件由编译器创建,但链接器仍然必须将它们变成可执行文件。

标签: c++ netbeans remote-debugging cppunit


【解决方案1】:

您不运行目标文件。链接器使用目标文件来创建实际的可执行文件。

使用 C++(或 C)从一组源文件创建程序需要几个步骤:

  1. 首先,当前源文件通过预处理器。这是处理 #include 之类的程序的程序。
  2. 然后实际的编译器接收预处理后的源文件,并创建一个目标文件(例如SisyTestData.o)。
  3. 链接器使用所有目标文件和可能的外部库来创建最终的可执行程序。

【讨论】:

    【解决方案2】:

    好的!循序渐进。

    • 1) 正如其他审阅者已经正确评论的那样,目标文件由编译器生成,因此链接器除了执行更多操作外,还可以关联代码库和生成的代码。

    为此,我认为您可以在这种模式下直接链接远程机器中的目标文件:

     $ g++ -o mybin myobj.o
    

    请注意,链接器应该能够找到对项目中包含的库的所有引用!

    • 2) 通常在 NetbeansIDE 的标准 C++ 项目中,构建项目后,您可以在文件夹“dist”中找到可执行文件,例如“dist/Debug/GNU-Linux-x86” 该文件已准备好在基于 linux 的本地和远程机器上运行。

    • 3) 您的可执行文件可能需要一些系统库。 您本地机器中的这个库被正确引用,但在您的远程机器中没有

    可以帮你解决这个问题的命令,

     $ ldd mybin
    

    您可以在此屏幕截图中查看简化的整个过程:

    • 4) 我想澄清另一个重点,NetBeans IDE 可以配置为使用任何编译器和任何设置。 目前,Linux 下最常见的 NetbeansIDE 版本默认配置为使用您机器上安装的 GCC,这清楚地表明从 NetbeansIDE 生成的目标文件与您直接从控制台编译生成的目标文件相同。

    NetBeans 中的编译步骤:

    【讨论】:

      猜你喜欢
      • 2018-08-16
      • 2012-12-18
      • 2011-08-26
      • 2010-12-29
      • 2014-09-20
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 2016-11-08
      相关资源
      最近更新 更多