【问题标题】:LNK2005 Error linking static openCV libraries with Visual Studio and QT CreatorLNK2005 将静态 openCV 库与 Visual Studio 和 QT Creator 链接时出错
【发布时间】:2012-03-30 16:11:16
【问题描述】:

我构建了静态 openCV 2.3 库。我的项目目前使用动态库没有问题,但现在我想使用静态库。我将库添加到我的 .pro 文件中:

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"

并包含目录:

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)" (?terminate@@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

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

【问题讨论】:

    标签: visual-studio qt opencv linker lnk2005


    【解决方案1】:

    在 CMake 上,在构建 openCV 静态库时,除了取消选中 BUILD_SHARED_LIBS 之外,我还取消选中了 BUILD_WITH_STATIC_CRT,这解决了这个特定问题

    【讨论】:

    • +1。似乎预构建的 Windows 静态库是使用静态 CRT (/MT) 构建的。如果您的项目使用动态 CRT (/MD),您必须自己重建 OpenCV。
    【解决方案2】:

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

    【讨论】:

    • 这个或 /MTd 用于调试构建
    【解决方案3】:

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

    【讨论】:

    • 还有其他解决方案吗?使用特定标志重建 openCV 或更改 Qt Creator 上的构建选项?为了构建 OpenCV 库,我刚刚构建了由 cmake 生成的解决方案文件,未选中构建共享库复选框,据我了解,这是为静态库获取解决方案所需要做的一切。从我读过的内容来看,在 Qt Creator 上,导入这些库应该是一件简单的事情吗?
    • 仅用于测试目的:您会尝试在发布模式而不是调试模式下编译您的项目吗?
    • 我一直在做发布。调试给了我类似“opencv_core231.lib(drawing.obj):-1:错误:LNK2038:检测到'_ITERATOR_DEBUG_LEVEL'不匹配:值'0'与main.obj中的值'2'不匹配”之类的错误。下面的解决方案为我修复了它,虽然我怀疑我将不得不重新启用该选项(因为它看起来像 QT 没有静态链接,我也希望它使我的项目可再分发)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-26
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 2016-02-19
    • 2016-04-14
    相关资源
    最近更新 更多