2012-03-14 81 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

相關問題