2012-03-14 72 views
6

Tôi đã xây dựng các thư viện tĩnh openCV 2.3. Dự án của tôi hiện đang sử dụng những người năng động mà không có vấn đề gì, nhưng bây giờ tôi muốn sử dụng libs tĩnh. Tôi thêm libs để tập .pro tôi:LNK2005 Lỗi liên kết các thư viện openCV tĩnh với Visual Studio và 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" 

Và bao gồm dirs:

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

Khi tôi cố gắng xây dựng tôi nhận được các lỗi này:

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 

Bất kỳ sự giúp đỡ hoặc gợi ý đánh giá cao .

Trả lời

9

On CMake, khi xây dựng các thư viện tĩnh OpenCV, ngoài cách bỏ chọn BUILD_SHARED_LIBS Tôi cũng đánh dấu BUILD_WITH_STATIC_CRT, và điều đó đã chăm sóc của vấn đề cụ thể

+2

+1. Có vẻ như các thư viện tĩnh dựng sẵn Windows được xây dựng với CRT tĩnh (/ MT). Nếu dự án của bạn sử dụng CRT động (/ MD), bạn phải tự xây dựng lại OpenCV. –

+0

+1. Đáng buồn nhưng là sự thật. –

+0

Đã xác nhận làm việc với OpenCV v3.1 quá – M2X

1

Sự cố dường như là trình liên kết của bạn cố gắng kết hợp các phiên bản khác nhau, không tương thích của thư viện thời gian chạy Visual C++ (CRT) vào một nhị phân đơn.
Hãy để tôi đoán trong tự nhiên: Mỗi phần của dự án của bạn và các thư viện bạn liên kết là NOT được tạo với cùng các tùy chọn tạo mã trong Visual C++.
Tôi tự hỏi liệu công tắc/NODEFAULTLIB có giải quyết được thách thức này không?

+0

Có giải pháp nào khác để thực hiện việc này không? Hoặc là xây dựng lại openCV với các cờ cụ thể hoặc thay đổi các tùy chọn xây dựng trên Qt Creator? Để xây dựng các thư viện OpenCV, tôi vừa xây dựng nó trong tệp giải pháp được tạo bởi cmake, với hộp kiểm xây dựng thư viện chia sẻ không được kiểm tra, mà theo tôi hiểu là tất cả những gì bạn cần làm để có được một giải pháp cho các lib tĩnh. Và trên Qt Creator từ những gì tôi đã đọc là nó phải là một vấn đề đơn giản của việc nhập khẩu những libs? – jzepeda

+0

Chỉ dành cho mục đích thử nghiệm: Bạn có cố gắng biên dịch dự án của mình ở chế độ phát hành, thay vì chế độ gỡ lỗi không? – salomon

+0

Tôi đã phát hành tất cả cùng. Gỡ lỗi cung cấp cho tôi các lỗi như "opencv_core231.lib (drawing.obj): - 1: lỗi: LNK2038: không khớp được phát hiện cho '_ITERATOR_DEBUG_LEVEL': giá trị '0' không khớp với giá trị '2' trong main.obj". Giải pháp dưới đây đã sửa nó cho tôi, mặc dù tôi nghi ngờ tôi sẽ phải bật lại tùy chọn (vì có vẻ như QT không được liên kết tĩnh và tôi cũng muốn điều đó làm cho dự án của tôi có thể phân phối lại được) – jzepeda

5

Hãy chắc chắn rằng dự án Properties-> Cấu hình Properties-> c/C++> Tạo mã: Thư viện thời gian chạy là Đa luồng (/ MT)

+0

mục này hoặc/MTd để xây dựng Gỡ lỗi – sastanin

Các vấn đề liên quan