Как правильно связать и включить библиотеки?

Это первый раз, когда я готовлю довольно сложное приложение на C ++ (Visual Studio 2010), и у меня возникают серьезные проблемы со связыванием, которые доставляют мне сильную головную боль (возможно, потому, что я так и не понял, о чем идет речь).

Я внедряю симулятор потока жидкости, используя:
— NVidia PhysX (SDK 3.2.3)
— глю (1,9)
— глотание (2.8.1)
— библиотека gltools (дополнение к OpenGL Superbible 5)

Я понятия не имею, как правильно установить параметры Release / Debug и MD / MDd / MT / MTd, чтобы все работало.

  • Я могу скомпилировать freeglut с MD / MDd / MT / MTd, а также с конфигурациями решений Relese / Release-Static / Debug / Debug-Static
  • Я могу скомпилировать gltools с MD / MDd / MT / MTd, а также с Relese / Debug
  • PhysX — это предварительно скомпилированные файлы lib и dll (я не знаю, какие параметры использовались в процессе компиляции)
  • То же самое касается глю

Я перепробовал много конфигураций, но все время получаю ошибки компиляции, такие как

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.

Release / 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.

Все без д (/ 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.

0

Решение

одна вещь, которая может указать вам на решение, состоит в том, что lib-файлы physx 3.2.3 создаются с параметром / MT, как указано в их документации (это часть zip-файла Physx в папке с документацией):

«Заметка
Статические библиотеки, которые мы предоставляем в виде двоичного дистрибутива Windows, связаны с многопоточными статическими библиотеками C Run-Time (CRT). Это означает, что ваше приложение также должно использовать тот же вариант CRT. Если вам нужно использовать другую версию CRT, вы должны перейти на нашу исходную лицензию. Исходный дистрибутив может быть просто перекомпилирован с использованием различных настроек CRT.
«Так что, если вы планируете ссылаться на них, вы должны использовать флаг / MT также для всех ваших других библиотек.

0

Другие решения

Добавить #define NDEBUG в файле, где вы включаете физические заголовки. Это удалит вашу проблему NDEBUG.

0

По вопросам рекламы [email protected]