1

ゲーム エンジンに 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 ライブラリをコンパイルしました。

4

1 に答える 1

0

私は自分の質問に対する答えを見つけました。次のプリプロセッサ定義を追加する必要があります。

PX_PHYSX_STATIC_LIB

またはPxConfig.h、他のインポートの前にヘッダー ファイルをインクルードすることもできますが、この方法はお勧めしません。なぜなら、IDE は常にこのインポートが不要であることを通知するからです (これはまったく正しくありません)。

于 2019-10-02T19:03:17.863 に答える