我之前发布过两个关于静态库和动态库的问题,得到了满意的答复。但仍然有一些缺失的环节。
我能够解决我的问题,但我不理解完整的概念。
要理解的概念:通过我之前的回复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/