2

Ubuntu を使用して PhysX を動作させようとしています。

まず、ここから SDK をダウンロードしました。


次に、ファイルを抽出し、各パッケージを次のようにインストールしました。

dpkg -i filename.deb

これにより、/usr/lib/PhysX/v2.8.1 にある次のファイルが得られます。

  • libNxCharacter.so
  • libNxCooking.so
  • libPhysXCore.so
  • libNxCharacter.so.1
  • libNxCooking.so.1
  • libPhysXCore.so.1

次に、/usr/lib へのシンボリック リンクを作成しました。

sudo ln -s /usr/lib/PhysX/v2.8.1/libNxCharacter.so.1 /usr/lib/libNxCharacter.so.1
sudo ln -s /usr/lib/PhysX/v2.8.1/libNxCooking.so.1 /usr/lib/libNxCooking.so.1
sudo ln -s /usr/lib/PhysX/v2.8.1/libPhysXCore.so.1 /usr/lib/libPhysXCore.so.1

ここで、Eclipse を使用して、次のライブラリを指定しました (-l):

  • libNxCharacter.so.1
  • libNxCooking.so.1
  • libPhysXCore.so.1

念のため、次の検索パス (-L):

  • /usr/lib/PhysX/v2.8.1
  • /usr/lib

また、Gerald Kaszuba が示唆したように、次のインクルード パス (-I) を追加しました。

  • /usr/lib/PhysX/v2.8.1
  • /usr/lib

次に、次のコードをコンパイルしようとしました。

#include "NxPhysics.h"

NxPhysicsSDK* gPhysicsSDK = NULL;
NxScene* gScene = NULL;
NxVec3 gDefaultGravity(0,-9.8,0);

void InitNx()
{
    gPhysicsSDK = NxCreatePhysicsSDK(NX_PHYSICS_SDK_VERSION);

    if (!gPhysicsSDK)
    {
        std::cout<<"Error"<<std::endl;
        return;
    }

    NxSceneDesc sceneDesc;
    sceneDesc.gravity = gDefaultGravity;
    gScene = gPhysicsSDK->createScene(sceneDesc);
}

int main(int arc, char** argv)
{
    InitNx();

    return 0;
}

私が得る最初のエラーは次のとおりです。

NxPhysics.h: そのようなファイルまたはディレクトリはありません

これは、プロジェクトが明らかに適切にリンクしていないことを示しています。私が間違ったことをしたこと、またはプロジェクトをコンパイルするために他に何をする必要があるか教えてもらえますか? GCC C++ コンパイラを使用しています。前もって感謝します!

4

3 に答える 3

2

ヘッダー ファイルとライブラリ ファイルを混同しているようです。NxPhysics.h は、ソース コードのヘッダー ファイルです。ヘッダー ファイルは、ソース コードのコンパイル時に必要です (リンク時ではありません)。おそらく /usr/include や /usr/include/PhysX/v2.8.1 などの場所にあります。Gerald Kaszuba が提案するように、このファイルの実際の場所を見つけて、 -I オプションを使用してコンパイラにその場所を伝えるようにしてください。

ライブラリは、コンパイルされたオブジェクト ファイルをリンクするときに必要です (コンパイル時ではありません)。これは、後で -L および -l オプションを使用して処理する必要があります。

注: gcc の呼び出し方法によっては、gcc をコンパイルしてから 1 回の呼び出しでリンクすることができますが、舞台裏ではコンパイル ステップとリンク ステップを実行します。


編集:余分な説明が追加されました...

C/C++ コンパイラを使用してバイナリをビルドする場合、コンパイラはソース コード (.c または .cpp ファイル) を読み取ります。読み取り中に、.h ファイルの読み取りに使用される #include ステートメントが頻繁に使用されます。#include ステートメントは、ロードする必要があるファイルの名前を指定します。これらの正確なファイルがインクルード パスに存在する必要があります。あなたの場合、「NxPhysics.h」という正確な名前のファイルがインクルード パスのどこかにある必要があります。通常、/usr/include はデフォルトでパスに含まれており、現在のディレクトリも同様です。ヘッダーが /usr/include のサブディレクトリなどの別の場所にある場合は、 -I コマンドライン スイッチ (または場合によっては環境変数やその他のシステム構成方法) を使用して、コンパイラにどこを探すかを明示的に伝える必要があります。

.h ヘッダー ファイルには通常、データ構造の宣言、インライン関数の定義、関数とクラスの宣言、および #define マクロが含まれます。コンパイルが完了すると、.o オブジェクト ファイルが作成されます。コンパイラーは .so または .a ライブラリーを認識せず、リンカーのヘルパー情報を少し埋め込む以外にそれらを使用することはできません。コンパイラは、オブジェクト ファイルにいくつかの「ヘッダー」情報も埋め込むことに注意してください。「ヘッダー」を引用符で囲みます。この情報は、.h ファイルにあるものとないものに大まかに対応しているだけだからです。これには、エクスポートされたすべての宣言のバイナリ表現が含まれます。そこにはマクロが見つかりません。インライン関数も省略されていると思います(ただし、間違っている可能性があります)。

すべての .o ファイルが存在すると、次は別のプログラム (リンカー) に引き継がれます。リンカーは、ソース コード ファイルや .h ヘッダー ファイルについて何も知りません。バイナリ ライブラリとオブジェクト ファイルのみを考慮します。ライブラリとオブジェクト ファイルのコレクションを指定します。「ヘッダー」には、定義するもの (データ型、関数など) と、他の人に定義してもらう必要があるものをリストします。次に、リンカーは、あるモジュールからの定義の要求を、他のモジュールの実際の定義と照合します。複数の競合する定義がないことを確認し、実行可能ファイルをビルドする場合は、定義に対するすべての要求が満たされていることを確認します。

上記の説明には、いくつかの注目すべき注意事項があります。まず、gcc を 1 回呼び出すだけで、コンパイルとリンクの両方を行うことができます。

gcc hello.c -o hello

最初に hello.c をメモリまたは一時ファイルにコンパイルし、次に標準ライブラリにリンクして hello 実行可能ファイルを書き出します。gcc への呼び出しは 1 回だけですが、便宜上、両方の手順が順番に実行されます。ここでは、動的ライブラリの詳細については説明を省略します。

あなたが Java プログラマーである場合、上記のいくつかは少し混乱するかもしれません。.net は Java のように機能するので、次の説明は C# およびその他の .net 言語に適用する必要があります。Java は、構文的には C や C++ よりもはるかに単純な言語です。マクロがなく、真のテンプレートがありません (ジェネリックはテンプレートの非常に弱い形式です)。このため、Java は別個の宣言 (.h) ファイルと定義 (.c) ファイルの必要性をスキップします。また、すべての関連情報をオブジェクト ファイル (Java の場合は .class) に埋め込むこともできます。これにより、コンパイラとリンカーの両方が .class ファイルを直接使用できるようになります。

于 2009-01-06T04:38:18.600 に答える
0

インストール中に次のエラーが発生しました*

dpkg: dependency problems prevent configuration of libphysx-dev-2.8.1:
 libphysx-dev-2.8.1 depends on libphysx-2.8.1 (= 2.8.1-4); however:
  Package libphysx-2.8.1 is not configured yet.
dpkg: error processing libphysx-dev-2.8.1 (--install):
 dependency problems - leaving unconfigured
Errors were encountered while processing:

* だから私は *libphysx-2.8.1_4_i386.deb* を再インストールしました

sudo dpkg -i libphysx-2.8.1_4_i386.deb 
于 2011-02-22T18:35:21.477 に答える
0

問題は確かに私のインクルードパスにありました。関連するコマンドは次のとおりです。

g++ -I/usr/include/PhysX/v2.8.1/SDKs/PhysXLoader/include -I/usr/include -I/usr/include/PhysX/v2.8.1/LowLevel/API/include -I/usr/include/PhysX/v2.8.1/LowLevel/hlcommon/include -I/usr/include/PhysX/v2.8.1/SDKs/Foundation/include -I/usr/include/PhysX/v2.8.1/SDKs/Cooking/include -I/usr/include/PhysX/v2.8.1/SDKs/NxCharacter/include -I/usr/include/PhysX/v2.8.1/SDKs/Physics/include -O0 -g3 -DNX_DISABLE_FLUIDS -DLINUX -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp"

また、リンカーには「PhysXLoader」のみが必要でした (Windows と同じ)。したがって、私は持っています:

g++  -o"PhysXSetupTest"  ./main.o   -lglut -lPhysXLoader
于 2009-01-06T08:17:26.380 に答える