0

我在本地计算机上有一个项目,我想在服务器(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 我得到

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

4

2 回答 2

4

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

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

  1. 首先,当前源文件通过预处理器。这是处理诸如#include.
  2. 然后实际的编译器接收预处理的源代码,并创建一个目标文件(例如SisyTestData.o)。
  3. 链接器使用所有目标文件和可能的外部库来创建最终的可执行程序。
于 2012-12-18T08:32:30.067 回答
0

行!逐步进行。

  • 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 中的编译步骤:

NetBeans 中的编译步骤:

于 2012-12-18T19:29:54.693 回答