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 には、ローカル コンピューターで起動したときに機能した 1 つのテストケースが含まれています (サーバー上では実行されました)。

コマンドラインからnetbeansによって作成されたファイルを実行することは一般的に不可能ですか? サーバー上で直接コンパイルしてリンクする必要がありますか?

4

2 に答える 2

4

オブジェクトファイルは実行しません。オブジェクト ファイルは、実際の実行可能ファイルを作成するためにリンカーによって使用されます。

C++ (または C) で一連のソース ファイルからプログラムを作成するには、いくつかの手順を実行します。

  1. まず、現在のソース ファイルがプリプロセッサに渡されます。などを扱うプログラムです#include
  2. 次に、実際のコンパイラは前処理されたソースを受け取り、オブジェクト ファイル (例: SisyTestData.o) を作成します。
  3. すべてのオブジェクト ファイルと可能な外部ライブラリは、最終的な実行可能プログラムを作成するためにリンカーによって使用されます。
于 2012-12-18T08:32:30.067 に答える
0

Ok!ステップで行きます。

  • 1)他のレビューアがすでに正しくコメントしているように、オブジェクトファイルはコンパイラによって生成されるため、リンカは、より多くの操作を実行するだけでなく、コードライブラリと生成されたコードを関連付けることができます。

このために、このモードでリモートマシンのオブジェクトファイルを直接リンクできると思います。

 $ g++ -o mybin myobj.o

リンカは、プロジェクトに含まれているライブラリへのすべての参照を見つけることができるはずです。

  • 2)通常、NetbeansIDEの標準C ++プロジェクトでは、プロジェクトをビルドした後、実行可能ファイルは「dist」の例「dist / Debug/GNU-Linux-x86」にあります。このファイルはローカルおよびリモートで実行する準備ができています。 Linuxベースのマシン。

  • 3)実行可能ファイルにシステムライブラリが必要な可能性があります。ローカルマシンのこのライブラリは正しく参照されていますが、リモートマシンでは参照されていません

この問題を解決するには、コマンドを実行するのに役立ちます。

 $ ldd mybin

このスクリーンショットでは、プロセス全体を簡略化して表示できます。

このスクリーンショットでは、プロセス全体を簡略化して表示できます。

  • 4)もう1つの重要な点を明確にしておきたいのですが、NetBeans IDEは、任意のコンパイラと任意の設定を使用するように構成できます。現在、LinuxでのNetbeansIDEの最も一般的なバージョンは、マシンにインストールされているGCCを使用するようにデフォルトで構成されています。これにより、NetbeansIDEから生成されたオブジェクトファイルは、コンソールから直接コンパイルされたものと同じであることがわかります。

NetBeansでのコンパイルの手順:

NetBeansでのコンパイルの手順:

于 2012-12-18T19:29:54.693 に答える