2012-03-14 88 views
6

我构建了静态openCV 2.3库。我的项目目前使用动态的没有问题,但现在我想使用静态库。我加入了库到我的.pro文件:LNK2005将静态openCV库与Visual Studio和QT Creator链接时出错

LIBS += "C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_calib3d231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_contrib231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_core231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_features2d231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_flann231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_gpu231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_haartraining_engine.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_highgui231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_imgproc231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_legacy231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_ml231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_objdetect231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_ts231.lib" \ 
"C:\Program Files\openCV_VS_static\opencv\build\lib\Release\opencv_video231.lib" 

而且include目录:

INCLUDEPATH += "C:\Program Files\openCV_VS_static\opencv\build\include" 
INCLUDEPATH += "C:\Program Files\openCV_VS_static\opencv\build\include\opencv" 

当我尝试建立我得到这些错误:

LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(mlock.obj) : error LNK2005: __unlock already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(mlock.obj) : error LNK2005: __lock already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0dat.obj) : error LNK2005: __cexit already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" ([email protected]@YAXXZ) already defined in MSVCRT.lib(MSVCR100.dll) 
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in MSVCRT.lib(cinitexe.obj) 
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRT.lib(cinitexe.obj) 
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRT.lib(cinitexe.obj) 
LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRT.lib(cinitexe.obj) 
LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type already defined in MSVCRT.lib(MSVCR100.dll) 
LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library 
LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library 

任何帮助或建议表示赞赏。

回答

9

在CMake的,建筑在OpenCV的静态库,除了取消选中BUILD_SHARED_LIBS我也选中BUILD_WITH_STATIC_CRT,并照顾特定问题的

+2

+1。似乎预构建的Windows静态库是使用静态CRT(/ MT)构建的。如果你的项目使用动态CRT(/ MD),你必须自己重建OpenCV。 – 2013-04-09 09:10:02

+0

+1。悲伤但真实。 – 2013-06-12 18:07:12

+0

已确认与OpenCV v3.1一起工作 – M2X 2016-10-20 05:05:27

1

问题似乎是您的连接器尝试将不同的不兼容版本的Visual C++运行时库(CRT)组合到一个单一的二进制文件中。
让我猜测:项目的每个部分以及链接的库都是而不是,它们在Visual C++中使用相同的代码生成选项生成。
我想知道/ NODEFAULTLIB开关是否可以解决这个问题?

+0

是否有另一种解决方案来做到这一点?要么使用特定标志重建openCV,要么更改Qt Creator上的构建选项?为了构建OpenCV库,我只是将它构建为由cmake生成的解决方案文件,并且未选中构建共享库复选框,这对我来说只是为了获得静态库的解决方案而需要做的。从我读过的Qt Creator应该是一个简单的导入这些库的问题? – jzepeda 2012-03-15 06:05:16

+0

仅用于测试目的:您是否尝试在发布模式下而不是调试模式下编译项目? – salomon 2012-03-15 16:48:59

+0

我一直在做发布。调试给我错误,如“opencv_core231.lib(drawing.obj): - 1:错误:LNK2038:检测到'_ITERATOR_DEBUG_LEVEL'不匹配:值'0'与main.obj中的值'2'不匹配。下面的解决方案为我解决了这个问题,虽然我怀疑我必须重新启用这个选项(因为它看起来像QT没有静态链接,我也想让我的项目可再发行) – jzepeda 2012-03-16 02:16:44

5

确保项目属性 - >配置属性 - > C/C++>代码生成:运行时库是多线程(/ MT)

+0

this或/ MTd用于调试版本 – sastanin 2014-11-03 14:39:41