0

这是我第一次在 C++ (Visual Studio 2010) 中准备一个非常复杂的应用程序,并且我遇到了严重的链接问题,这让我非常头疼(也许是因为我从来没有得到它的全部内容)。

我正在使用以下方法实现流体流动模拟器: - NVidia PhysX (SDK 3.2.3) - glew (1.9) - freeglut (2.8.1) - gltools 库(OpenGL Superbible 5th 的插件)

我不知道如何正确设置发布/调试和 MD/MDd/MT/MTd 选项以使一切正常。

  • 我可以使用 MD/MDd/MT/MTd 以及 Relese/Release-Static/Debug/Debug-Static 解决方案配置来编译 freeglut
  • 我可以用 MD/MDd/MT/MTd 和 Relese/Debug 编译 gltools
  • PhysX 是预编译的 lib 和 dll 文件(我不知道编译过程中使用了哪些选项)
  • 同样是关于 glew

我尝试了很多配置,但总是遇到编译错误,例如

defaultlib 'MSVCRT' conflicts with use of other libs;

或者

fatal error C1189: #error :  Exactly one of NDEBUG and _DEBUG needs to be defined by preprocessor

我读到这都是关于以正确的方式设置提到的配置,但我实际上做不到。

什么应该是正确的配置(为什么?)以及我应该将哪些库与 lib 文件链接,哪些与 dll 链接?我是 C++ 的新手,所以请尽量解释清楚。

那是我的应用程序的“包含部分”(它非常相似,并且在我不小心破坏它之前就起作用了):

//#define WIN32
#include <windows.h>        // Must have for Windows platform builds

#include <GLTools.h>
#include <GLFrustum.h>
#include <GLBatch.h>
#include <GLMatrixStack.h>
#include <GLShaderManager.h>
#include <GLGeometryTransform.h>
#include <StopWatch.h>

//#define GLEW_STATIC
#include <GL\glew.h>            // OpenGL Extension "autoloader"
//#define FREEGLUT_STATIC
#include <GL\freeglut.h>
//#include <GL\gl.h>            // Microsoft OpenGL headers (version 1.1 by themselves)

#include <math.h>
#include <stdio.h>
#include <iostream>

using namespace std;

#include <PxPhysicsAPI.h> 
#include <extensions/PxExtensionsAPI.h> 
#include <extensions/PxDefaultErrorCallback.h>
#include <extensions/PxDefaultAllocator.h> 
#include <extensions/PxDefaultSimulationFilterShader.h>
#include <extensions/PxDefaultCpuDispatcher.h>
#include <extensions/PxShapeExt.h>
#include <foundation/PxMat33.h> 

#include <pxtask/PxCudaContextManager.h>
#include <physxprofilesdk\PxProfileZoneManager.h>

#include <extensions/PxSimpleFactory.h>

#pragma comment(lib, "PhysX3_x86.lib")
#pragma comment(lib, "PhysX3Common_x86.lib") 
#pragma comment(lib, "PxTask.lib")
#pragma comment(lib, "PhysX3Extensions.lib")
#pragma comment(lib, "PhysXProfileSDK")

如果一切都设置好,我不确定是否需要最后一条车道(在谷歌的某个地方找到它并且它有效)。

如果您需要更多信息或更详细的错误日志以及某些配置,请告诉我,我会提供。

提前致谢!

编辑:

调试 /MDd

PxTask.lib(CudaWrapper.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtDefaultSimulationFilterShader.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtSimpleFactory.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtDefaultCpuDispatcher.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtDefaultErrorCallback.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtRigidBodyExt.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtCpuWorkerThread.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysXProfileSDK.lib(PxProfileEventImpl.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>main.obj : error LNK2019: unresolved external symbol _glewInit@0 referenced in function "void __cdecl init(void)" (?init@@YAXXZ)
1>C:\dev\SPHFluids\SPHFluids\Debug\SPHFluids.exe : fatal error LNK1120: 1 unresolved externals
1>
1>Build FAILED.

发布/MDd

PxTask.lib(CudaWrapper.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtDefaultSimulationFilterShader.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtDefaultErrorCallback.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtDefaultCpuDispatcher.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtSimpleFactory.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtCpuWorkerThread.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtRigidBodyExt.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysXProfileSDK.lib(PxProfileEventImpl.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>main.obj : error LNK2001: unresolved external symbol _glewInit@0
1>C:\dev\SPHFluids\SPHFluids\Release\SPHFluids.exe : fatal error LNK1120: 1 unresolved externals
1>
1>Build FAILED.

发布/MTd

PxTask.lib(CudaWrapper.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtDefaultSimulationFilterShader.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtDefaultErrorCallback.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtDefaultCpuDispatcher.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtSimpleFactory.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtCpuWorkerThread.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysX3Extensions.lib(ExtRigidBodyExt.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>PhysXProfileSDK.lib(PxProfileEventImpl.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _fclose already defined in LIBCMTD.lib(fclose.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _fwrite already defined in LIBCMTD.lib(fwrite.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _free already defined in LIBCMTD.lib(dbgfree.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _malloc already defined in LIBCMTD.lib(dbgmalloc.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _fgetc already defined in LIBCMTD.lib(fgetc.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: _fprintf already defined in LIBCMTD.lib(fprintf.obj)
1>MSVCRT.lib(MSVCR100.dll) : error LNK2005: ___iob_func already defined in LIBCMTD.lib(_file.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>libcpmtd.lib(xdebug.obj) : warning LNK4098: defaultlib 'libcmt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>main.obj : error LNK2001: unresolved external symbol _glewInit@0
1>C:\dev\SPHFluids\SPHFluids\Release\SPHFluids.exe : fatal error LNK1120: 1 unresolved externals
1>
1>Build FAILED.

没有 d 的一切(/MD /MT):

c:\dev\soft\physx-3.2.3_pc_sdk_core\include\foundation\pxpreprocessor.h(318): fatal error C1189: #error :  Exactly one of NDEBUG and _DEBUG needs to be defined by preprocessor

它只是 lib 文件的一种配置。我可以以其他方式编译 gltools 和 freeglut,或者以其他方式设置 #define GLEW_STATIC 或 #define FREEGLUT_STATIC ......对于新手来说选择太多了。:)

多一个:

1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>main.obj : error LNK2001: unresolved external symbol "class physx::PxFlags<enum physx::PxFilterFlag::Enum,unsigned short> __cdecl physx::PxDefaultSimulationFilterShader(unsigned int,struct physx::PxFilterData,unsigned int,struct physx::PxFilterData,class physx::PxFlags<enum physx::PxPairFlag::Enum,unsigned short> &,void const *,unsigned int)" (?PxDefaultSimulationFilterShader@physx@@YA?AV?$PxFlags@W4Enum@PxFilterFlag@physx@@G@1@IUPxFilterData@1@I0AAV?$PxFlags@W4Enum@PxPairFlag@physx@@G@1@PBXI@Z)
1>main.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall physx::PxDefaultErrorCallback::~PxDefaultErrorCallback(void)" (??1PxDefaultErrorCallback@physx@@UAE@XZ)
1>main.obj : error LNK2001: unresolved external symbol "public: __thiscall physx::PxDefaultErrorCallback::PxDefaultErrorCallback(void)" (??0PxDefaultErrorCallback@physx@@QAE@XZ)
1>main.obj : error LNK2001: unresolved external symbol "public: static class physx::PxProfileZoneManager & __cdecl physx::PxProfileZoneManager::createProfileZoneManager(class physx::PxFoundation *)" (?createProfileZoneManager@PxProfileZoneManager@physx@@SAAAV12@PAVPxFoundation@2@@Z)
1>main.obj : error LNK2001: unresolved external symbol "class physx::pxtask::CudaContextManager * __cdecl physx::pxtask::createCudaContextManager(class physx::PxFoundation &,class physx::pxtask::CudaContextManagerDesc const &,class physx::PxProfileZoneManager *)" (?createCudaContextManager@pxtask@physx@@YAPAVCudaContextManager@12@AAVPxFoundation@2@ABVCudaContextManagerDesc@12@PAVPxProfileZoneManager@2@@Z)
1>main.obj : error LNK2001: unresolved external symbol "class physx::PxDefaultCpuDispatcher * __cdecl physx::PxDefaultCpuDispatcherCreate(unsigned int,unsigned int *)" (?PxDefaultCpuDispatcherCreate@physx@@YAPAVPxDefaultCpuDispatcher@1@IPAI@Z)
1>main.obj : error LNK2001: unresolved external symbol __imp__PxCreateFoundation
1>main.obj : error LNK2001: unresolved external symbol _glewInit@0
1>main.obj : error LNK2001: unresolved external symbol _PxCreatePlane
1>main.obj : error LNK2001: unresolved external symbol __imp__PxRegisterArticulations
1>main.obj : error LNK2001: unresolved external symbol __imp__PxRegisterHeightFields
1>main.obj : error LNK2001: unresolved external symbol __imp__PxCreateBasePhysics
1>C:\dev\SPHFluids\SPHFluids\Release\SPHFluids.exe : fatal error LNK1120: 12 unresolved externals
1>
1>Build FAILED.

所有这些 PhysX pragma 都被评论了。

4

2 回答 2

0

可能会为您指明解决方案的一件事是 physx 3.2.3 lib 文件是使用 /MT 选项构建的,如其文档中所示(这是文档文件夹中 physx zip 的一部分):

“注意我们随 Windows 二进制分发提供的静态库与多线程静态 C 运行时 (CRT) 库链接。这意味着您的应用程序也必须使用相同的 CRT 风格。如果您需要使用不同的 CRT版本,您必须升级到我们的源代码许可证。源代码分发可以使用不同的 CRT 设置简单地重新编译。“因此,如果您打算链接这些,您还必须对所有其他库使用 /MT 标志。

于 2013-07-06T20:53:30.770 回答
0

在包含物理标题的文件中添加一个#define NDEBUG。这将消除您的 NDEBUG 问题。

于 2017-01-18T10:46:07.593 回答