c++ - OpenCV的运行时库和静态库

标签 c++ opencv

我之前发布过两个关于静态库和动态库的问题,得到了满意的答复。但仍然有一些缺失的环节。

我能够解决我的问题,但我不理解完整的概念。

要理解的概念:通过我之前的回复question ,我意识到我没有OpenCV的静态库,所以我安装了它们。现在,我在 Windows 7 中有了 OpenCV 的静态库。

我编写了一个简单的程序来测试 OpenCV 静态库的功能。

#include <iostream>
#include "opencv\highgui.h"
#include "opencv2\core\core.hpp"
#include "opencv2\imgproc\imgproc.hpp"

int main()
{
    cv::Mat image(100, 500, CV_8SC3, Scalar(0,0,255));
    std::cout << "\nstatic Libs test"<<std::endl;
    return 0;
}

以上代码的链接,我使用了OpenCV的静态库。

真正的问题:如果我在 Visual Studio 中选择 Multi-threaded Debug (/MTd) 运行时库,上面的代码可以毫无问题地编译、链接和运行。但是,如果我选择 Multi-threaded Debug DLL (/MDd) runtime libraries 那么,就会出现很多错误,如下所示(我没有包括所有错误):

Error   1   error LNK2038: mismatch detected for 'RuntimeLibrary': value 'MTd_StaticDebug' doesn't match value 'MDd_DynamicDebug' in Source.obj 
Error   22  error LNK2005: "public: __cdecl std::_Container_base12::_Container_base12(void)" (??0_Container_base12@std@@QEAA@XZ) already defined in opencv_core2411d.lib(alloc.obj)

我只是想了解C++的DLL运行时库和OpenCV的静态库之间发生这种冲突的原因。选择多线程调试 (/MTd) 后,C++ 库是否也静态链接?

最后,如果我想静态链接几个 openCV 库和动态链接几个 openCV 库,应该选择哪个运行时库选项(情况可能看起来很尴尬,但只是问一下)?

最佳答案

一些背景

/MT and /MD它们的调试等效项 (/xxd) 在 C++ 运行时中的链接不同。

  • /MD链接到C++运行时的dll版本
  • /MT 到静态库版本(即链接到二进制文件中的 C++ 运行时所需的内容)

注意:上面的版本是多线程的,过去也有单线程版本,但现在已经消失了。

错误

您收到这些错误是因为选项混合在一起,因此符号有多个定义 - 一个来自 dll 的导入库,一个来自静态库。链接器应该选择哪一个?鉴于冲突,它无法确定结果,因此会出现错误。

... which runtime library option should be selected if I want to link few openCV libraries statically and few dynamically...?

不要混用。它会导致您正在处理的此类错误。链接 C++(和 C 代码)的一般建议是与运行时的链接方式保持一致。

我通常会进一步详细说明所有库的链接之间应该有一致性,无论是所有静态的还是所有动态的(当然它们可以混合,但如果没有对内存和资源的深刻理解,就不应该这样做涉及的问题 - 通常不值得冒险)。

关于c++ - OpenCV的运行时库和静态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32612157/

相关文章:

c++ - 在实例方法中使用 find_if

opencv - OPENCV(不受支持的格式或组合格式)SURF

Android - Opencv如何将黑白垫保存为透明PNG

opencv - 将 numpy 与自制软件联系起来

C++ opencv 访问像素值不正确

c++ - 如何将 LPVOID 验证为 <Bad Ptr>

c++ - 更改/添加 STL bitset<>::reference::operator=(int) 的行为

c++ - 在不更改数据类型的情况下可逆地组合两个 uint32_t

C++:将引用作为参数传递,但该函数不接受引用作为参数

android - 如何将 OpenCV 集成到 Qt Creator Android 项目中