无法执行Netbeans创建的.o文件

时间:2012-12-18 08:28:17

标签: c++ netbeans remote-debugging cppunit

我的本​​地计算机上有一个项目,我想在服务器上运行/调试cppunit测试(Debian)。我使用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,我

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创建的文件吗?我是否必须直接在服务器上编译和链接它?

2 个答案:

答案 0 :(得分:4)

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

从C ++(或C)中的一组源文件创建程序分几步完成:

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

答案 1 :(得分:0)

好!分步进行。

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

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

 $ g++ -o mybin myobj.o

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

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

  • 3)您的可执行文件可能需要一些系统库。 本地计算机中的此库已正确引用,但未在远程计算机中引用

解决此问题可以帮助您完成命令,

 $ ldd mybin

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

You can view the entire process simplified in this screenshot:

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

NetBeans中的编译步骤:

Steps of compilation in NetBeans: