ゲーム エンジンに PhysX を実装しようとしていますが、PhysX ライブラリのリンクに関して奇妙な問題が発生しています。私が何をしても常に失敗しますが、Nvidia のスニペットは魅力的に機能します。私が何をしたかを説明しようとします.誰かが私が欠けているものを見つけてくれることを願っています.
まず、Githubから PhysX 4.1 をダウンロードしました。次に、buildtoolsの設定を次のように変更しました。
<?xml version="1.0" encoding="utf-8"?>
<preset name="vc15win64" comment="VC15 Win64 PhysX general settings">
<platform targetPlatform="win64" compiler="vc15" />
<CMakeSwitches>
<cmakeSwitch name="PX_BUILDSNIPPETS" value="True" comment="Generate the snippets" />
<cmakeSwitch name="PX_BUILDPUBLICSAMPLES" value="True" comment="Generate the samples projects" />
<cmakeSwitch name="PX_GENERATE_STATIC_LIBRARIES" value="True" comment="Generate static libraries" />
<cmakeSwitch name="NV_USE_STATIC_WINCRT" value="False" comment="Use the statically linked windows CRT" />
<cmakeSwitch name="NV_USE_DEBUG_WINCRT" value="True" comment="Use the debug version of the CRT" />
<cmakeSwitch name="PX_FLOAT_POINT_PRECISE_MATH" value="True" comment="Float point precise math" />
</CMakeSwitches>
<CMakeParams>
<cmakeParam name="CMAKE_INSTALL_PREFIX" value="install/vc15win64/PhysX" comment="Install path relative to PhysX SDK root" />
</CMakeParams>
</preset>
次に、バットスクリプトを使用して、静的リンクおよびランタイム スタティック ライブラリ用のVisual Studio 2017プロジェクトを生成しました。次に、プロジェクトをデバッグバージョンとリリースバージョンでコンパイルしました。SniptestHelloWorldは問題なく動作します。ここまでは順調ですね。そこで、 Visual Studio 2017で新しいプロジェクトを作成し、x64プロセッサ アーキテクチャを選択しました (PhysX xml 構成のように)。次に、 SniptestHelloWorldと同じ方法でヘッダー ファイルをインクルードしました。ここにツリーがあります:
| PxActor.h
| PxAggregate.h
| PxArticulation.h
| PxArticulationBase.h
| PxArticulationJoint.h
| PxArticulationJointReducedCoordinate.h
| PxArticulationLink.h
| PxArticulationReducedCoordinate.h
| PxBatchQuery.h
| PxBatchQueryDesc.h
| PxBroadPhase.h
| PxClient.h
| PxConfig.h
| PxConstraint.h
| PxConstraintDesc.h
| PxContact.h
| PxContactModifyCallback.h
| PxDeletionListener.h
| PxFiltering.h
| PxForceMode.h
| PxFoundation.h
| PxImmediateMode.h
| PxLockedData.h
| PxMaterial.h
| PxPhysics.h
| PxPhysicsAPI.h
| PxPhysicsSerialization.h
| PxPhysicsVersion.h
| PxPhysXConfig.h
| PxPruningStructure.h
| PxQueryFiltering.h
| PxQueryReport.h
| PxRigidActor.h
| PxRigidBody.h
| PxRigidDynamic.h
| PxRigidStatic.h
| PxScene.h
| PxSceneDesc.h
| PxSceneLock.h
| PxShape.h
| PxSimulationEventCallback.h
| PxSimulationStatistics.h
| PxVisualizationParameter.h
| stack.txt
|
+---characterkinematic
| PxBoxController.h
| PxCapsuleController.h
| PxController.h
| PxControllerBehavior.h
| PxControllerManager.h
| PxControllerObstacles.h
| PxExtended.h
|
+---collision
| PxCollisionDefs.h
|
+---common
| | PxBase.h
| | PxCollection.h
| | PxCoreUtilityTypes.h
| | PxMetaData.h
| | PxMetaDataFlags.h
| | PxPhysicsInsertionCallback.h
| | PxPhysXCommonConfig.h
| | PxProfileZone.h
| | PxRenderBuffer.h
| | PxSerialFramework.h
| | PxSerializer.h
| | PxStringTable.h
| | PxTolerancesScale.h
| | PxTypeInfo.h
| |
| \---windows
| PxWindowsDelayLoadHook.h
|
+---cooking
| PxBVH33MidphaseDesc.h
| PxBVH34MidphaseDesc.h
| PxBVHStructureDesc.h
| Pxc.h
| PxConvexMeshDesc.h
| PxCooking.h
| PxMidphaseDesc.h
| PxTriangleMeshDesc.h
|
+---cudamanager
| PxCudaContextManager.h
| PxCudaMemoryManager.h
|
+---extensions
| PxBinaryConverter.h
| PxBroadPhaseExt.h
| PxCollectionExt.h
| PxConstraintExt.h
| PxContactJoint.h
| PxConvexMeshExt.h
| PxD6Joint.h
| PxD6JointCreate.h
| PxDefaultAllocator.h
| PxDefaultCpuDispatcher.h
| PxDefaultErrorCallback.h
| PxDefaultSimulationFilterShader.h
| PxDefaultStreams.h
| PxDistanceJoint.h
| PxExtensionsAPI.h
| PxFixedJoint.h
| PxJoint.h
| PxJointLimit.h
| PxMassProperties.h
| PxPrismaticJoint.h
| PxRaycastCCD.h
| PxRepXSerializer.h
| PxRepXSimpleType.h
| PxRevoluteJoint.h
| PxRigidActorExt.h
| PxRigidBodyExt.h
| PxSceneQueryExt.h
| PxSerialization.h
| PxShapeExt.h
| PxSimpleFactory.h
| PxSmoothNormals.h
| PxSphericalJoint.h
| PxStringTableExt.h
| PxTriangleMeshExt.h
|
+---filebuf
| PxFileBuf.h
|
+---foundation
| | Px.h
| | PxAllocatorCallback.h
| | PxAssert.h
| | PxBitAndData.h
| | PxBounds3.h
| | PxErrorCallback.h
| | PxErrors.h
| | PxFlags.h
| | PxFoundationConfig.h
| | PxIntrinsics.h
| | PxIO.h
| | PxMat33.h
| | PxMat44.h
| | PxMath.h
| | PxMathUtils.h
| | PxMemory.h
| | PxPlane.h
| | PxPreprocessor.h
| | PxProfiler.h
| | PxQuat.h
| | PxSharedAssert.h
| | PxSimpleTypes.h
| | PxStrideIterator.h
| | PxTransform.h
| | PxUnionCast.h
| | PxVec2.h
| | PxVec3.h
| | PxVec4.h
| |
| +---unix
| | PxUnixIntrinsics.h
| |
| \---windows
| PxWindowsIntrinsics.h
|
+---geometry
| PxBoxGeometry.h
| PxBVHStructure.h
| PxCapsuleGeometry.h
| PxConvexMesh.h
| PxConvexMeshGeometry.h
| PxGeometry.h
| PxGeometryHelpers.h
| PxGeometryQuery.h
| PxHeightField.h
| PxHeightFieldDesc.h
| PxHeightFieldFlag.h
| PxHeightFieldGeometry.h
| PxHeightFieldSample.h
| PxMeshQuery.h
| PxMeshScale.h
| PxPlaneGeometry.h
| PxSimpleTriangleMesh.h
| PxSphereGeometry.h
| PxTriangle.h
| PxTriangleMesh.h
| PxTriangleMeshGeometry.h
|
+---geomutils
| GuContactBuffer.h
| GuContactPoint.h
|
+---gpu
| PxGpu.h
|
+---pvd
| PxPvd.h
| PxPvdSceneClient.h
| PxPvdTransport.h
|
+---solver
| PxSolverDefs.h
|
+---task
| PxCpuDispatcher.h
| PxTask.h
| PxTaskDefine.h
| PxTaskManager.h
|
\---vehicle
PxVehicleComponents.h
PxVehicleDrive.h
PxVehicleDrive4W.h
PxVehicleDriveNW.h
PxVehicleDriveTank.h
PxVehicleNoDrive.h
PxVehicleSDK.h
PxVehicleShaders.h
PxVehicleTireFriction.h
PxVehicleUpdate.h
PxVehicleUtil.h
PxVehicleUtilControl.h
PxVehicleUtilSetup.h
PxVehicleUtilTelemetry.h
PxVehicleWheels.h
これらはすべて必要なヘッダーファイルだと思います。次に、リンク用の lib ファイルのリストを追加しました (私の意見では、そのうちのいくつかは不要です)。
PhysX_static_64.lib
PhysXPvdSDK_static_64.lib
PhysXVehicle_static_64.lib
PhysXCharacterKinematic_static_64.lib
CPhysXExtensions_static_64.lib
PhysXCooking_static_64.lib
PhysXCommon_static_64.lib
PhysXFoundation_static_64.lib
SnippetUtils_static_64.lib
SnippetRender_static_64.lib
そして、それが機能するかどうかをテストするために、非常に単純な C++ コードを作成しました。
#include "PxPhysicsAPI.h"
int main()
{
auto Allocator = physx::PxDefaultAllocator();
auto ErrorCallback = physx::PxDefaultErrorCallback();
auto Foundation = PxCreateFoundation(PX_PHYSICS_VERSION, Allocator, ErrorCallback);
auto PhysXVisualDebugger = PxCreatePvd(*Foundation);
const auto transport = physx::PxDefaultPvdSocketTransportCreate("127.0.0.1", 5425, 10);
PhysXVisualDebugger->connect(*transport, physx::PxPvdInstrumentationFlag::eALL);
auto Physics = PxCreatePhysics(PX_PHYSICS_VERSION, *Foundation, physx::PxTolerancesScale(), true, PhysXVisualDebugger);
physx::PxSceneDesc sceneDesc(Physics->getTolerancesScale());
sceneDesc.gravity = physx::PxVec3(0.0f, -9.81f, 0.0f);
auto Dispatcher = physx::PxDefaultCpuDispatcherCreate(2);
sceneDesc.cpuDispatcher = Dispatcher;
sceneDesc.filterShader = physx::PxDefaultSimulationFilterShader;
auto Scene = Physics->createScene(sceneDesc);
auto pvdClient = Scene->getScenePvdClient();;
pvdClient->setScenePvdFlag(physx::PxPvdSceneFlag::eTRANSMIT_CONSTRAINTS, true);
pvdClient->setScenePvdFlag(physx::PxPvdSceneFlag::eTRANSMIT_CONTACTS, true);
pvdClient->setScenePvdFlag(physx::PxPvdSceneFlag::eTRANSMIT_SCENEQUERIES, true);
}
そして... うまくいきません。単純なプロジェクトをコンパイルしようとすると、リンカーから常にこのエラーが発生します。
おかしく聞こえるかもしれませんが、私はほとんどすべてを試しました。PxCreatePhysics
呼び出しを削除しても問題なくコンパイルされるため、このエラーの原因となっている行がわかります。この 1 行だけがリンクに関する奇妙な問題を抱えていて、私には理解できません。
これを解決するにはどうすればよいですか? どこで答えを探せばいいのかもわかりません。同じソムパイラと同じマシンを使用して、正しい CPU アーキテクチャと正しいランタイム ライブラリ用にコンパイルされた PhysX ライブラリをコンパイルしました。