Physx - проблема связывания с функциями come (__imp_PxCreateBasePhysics, на которую ссылается функция ...) - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь внедрить PhysX в свой игровой движок, но у меня есть некоторые странные проблемы с подключением библиотеки PhysX. Это всегда терпит неудачу независимо от того, что я делаю, но фрагменты от Nvidia работают как шарм. Я постараюсь описать, что я сделал, и я надеюсь, что кто-то найдет то, что мне не хватает.

Прежде всего, я скачал PhysX 4.1 с Github . Затем я изменил настройки 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>

Затем я использовал скрипт bat для создания Visual Studio 2017 проекта для статическое связывание и статические библиотеки времени выполнения . Затем я скомпилировал проект в debug и release version. SnippestHelloWorld работает без проблем. Все идет нормально. Поэтому я создал новый проект в Visual Studio 2017 и выбрал x64 архитектуру процессора (как в конфигурации PhysX xml). Затем я включил заголовочные файлы так же, как в SnippestHelloWorld . Вот дерево:

|   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);
}

И ... Это просто не работает. Я всегда получаю эту ошибку от компоновщика, когда пытаюсь скомпилировать свой простой проект:

enter image description here

Это может звучать смешно, но я попробовал почти все. Я знаю, какая строка вызывает эту ошибку, потому что, если я удаляю вызов PxCreatePhysics, он без проблем компилируется. Только у этой строки есть какая-то странная проблема со связыванием, и я этого не понимаю.

Что я должен попытаться решить эту проблему? Я даже не знаю, где искать ответ. Я получил скомпилированную библиотеку PhysX, скомпилированную для правильной архитектуры ЦП и для правильных библиотек времени выполнения, с тем же компилятором и на той же машине, почему примеры от Nvidia работают, а мой код нет?

1 Ответ

0 голосов
/ 02 октября 2019

Я нашел ответ на свой вопрос. Вам нужно добавить это определение препроцессора:

PX_PHYSX_STATIC_LIB

Или вы можете включить заголовочный файл PxConfig.h перед другим импортом, но я бы не рекомендовал этот метод, потому что IDE будет постоянно информировать вас, чтоэтот импорт не нужен (что совсем не так).

...