Debian LinuxでのPhysXライブラリのインストールとリンク
質問
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 ++コンパイラを使用しています。事前に感謝します!
解決
ヘッダーファイルとライブラリファイルを混同しているようです。 NxPhysics.hはソースコードヘッダーファイルです。ヘッダーファイルは、ソースコードのコンパイル時に必要です(リンク時ではありません)。おそらく/ usr / includeや/usr/include/PhysX/v2.8.1などの場所にあります。 Gerald Kaszubaが示唆しているように、このファイルの実際の場所を見つけ、-Iオプションを使用してコンパイラに場所を伝えます。
ライブラリは、コンパイルされたオブジェクトファイルをリンクするときに必要です(コンパイル時ではありません)。後で-Lおよび-lオプションを使用して対処する必要があります。
注:gccの呼び出し方法によっては、1回の呼び出しでコンパイルしてからリンクすることもできますが、舞台裏ではまだコンパイル手順、リンク手順が実行されます。
編集:追加の説明を追加...
C / C ++コンパイラを使用してバイナリをビルドする場合、コンパイラはソースコード(.cまたは.cppファイル)を読み取ります。読み取り中に、.hファイルの読み取りに使用される#includeステートメントが頻繁にあります。 #includeステートメントは、ロードする必要があるファイルの名前を提供します。これらの正確なファイルは、インクルードパスに存在する必要があります。あなたの場合、「NxPhysics.h」という正確な名前のファイルインクルードパスのどこかにある必要があります。通常、/ usr / includeはデフォルトでパスにあり、現在のディレクトリもそうです。ヘッダーが/ usr / includeのサブディレクトリなどの別の場所にある場合は、-Iコマンドラインスイッチを使用して(または環境変数やその他のシステム構成方法を使用して)コンパイラーにどこを探すかを常に明示的に指示する必要があります。
.hヘッダーファイルには、通常、データ構造宣言、インライン関数定義、関数とクラスの宣言、および#defineマクロが含まれます。コンパイルが完了すると、.oオブジェクトファイルが作成されます。コンパイラーは、.soまたは.aライブラリーを認識していないため、リンカー用のヘルパー情報を少し埋め込む以外は、それらを使用することはできません。コンパイラは、いくつかの&quot; header&quot;も埋め込みます。オブジェクトファイルの情報。 「ヘッダー」を入れます情報は.hファイルで見つかる場合と見つからない場合にほぼ対応するためです。エクスポートされたすべての宣言のバイナリ表現が含まれます。そこにマクロは見つかりません。インライン関数も省略されていると思います(ただし、間違っている可能性があります)。
.oファイルがすべて存在したら、別のプログラムが引き継ぎます:リンカー。リンカは、ソースコードファイルまたは.hヘッダーファイルを何も知りません。バイナリライブラリとオブジェクトファイルのみを考慮します。ライブラリとオブジェクトファイルのコレクションを指定します。 「ヘッダー」で定義するもの(データ型、関数など)と、定義するために他の誰かが必要とするものをリストします。次に、リンカは、1つのモジュールからの定義の要求を、他のモジュールの実際の定義と照合します。複数の競合する定義が存在しないことを確認し、実行可能ファイルをビルドする場合、定義に対するすべての要求が満たされることを確認します。
上記の説明にはいくつか注意すべき点があります。まず、gccを1回呼び出して、コンパイルとリンクの両方を行うことができます。例:
gcc hello.c -o hello
は最初にhello.cをメモリまたは一時ファイルにコンパイルし、次に標準ライブラリにリンクしてhello実行可能ファイルを書き出します。 gccの呼び出しは1回だけですが、利便性のために両方の手順は引き続き順番に実行されます。ここでは、動的ライブラリの詳細の一部を説明しません。
あなたがJavaプログラマなら、上記のいくつかは少し混乱するかもしれません。 .netはJavaのように機能するため、次の説明はC#およびその他の.net言語に適用されるはずです。 Javaは、構文的にはCやC ++よりもはるかに単純な言語です。マクロがなく、真のテンプレートがありません
他のヒント
問題は実際にインクルードパスにありました。関連するコマンドは次のとおりです。
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
インストール中に次のエラーが発生しました *
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