1、对于不同VS平台打包的dll是不能共用的:
例如:VC120内核打包的opencv是无法在VC100内核上运行的,其否则在运行时会出错。这就要求使用对于的opencv版本。或者在VS集成环境下安装
两个内核,例如VC100跟VC120。一般在安装vs的时候会自己带一个内核。其中为:
其中vc10是适合在vs2010上测vc100内核上跑的。所以打包的时候也要选好合适的内核进行编译,否则很容易出错。
2、怎么打包的dll能被引用?
其中的对外的总接口函数需要使用“ extern "C" __declspec(dllexport)”进行修饰,这个是告诉编译器这个是c或者c++语言,
extern "C" __declspec(dllexport) bool init(); //初始化SVM分类器
/*
*src_img 是图像数据指针
*rows 是图像的行数
*cols 是图像的列数
*channels 是图像的通道数
*minarea 识别的图像最小面积,默认参数是1000.
*/
//extern "C" Food_API int Foodrecognition(string src_path, bool iscamera, int min_area);
//extern "C" Food_API char* Foodrecognition(int* srcimg, int with, int height, int channel, int min_area);
extern "C" __declspec(dllexport) char* Foodrecognition(int min_area);
其中那些不对外的函数则不需任何处理--值得是接口函数。接口函数调用的一些其他函数是不需要处理的。其中导入的dll就相当于把其cpp或者hpp加入c#工程里某个CPP里的全局变量还是全局变量。例如:在某个cpp里定义了一个全局
变量,其categorizer c(clusters)如下:
3、如果dll工程也是调用了其他第三方库的该怎么出来?
其中拿opencv来做例子,如果我一个人脸识别的接口函数调用了一些opencv的dll文件,这时我打包的dll名字叫face.dll文件,则在c#怎么进行调用?
我们需要把face.dll调用的所有dll文件放到C#工程exe对应的位置,其不用在工程里添加lib文件,其只需要dll文件即可。
Lib文件的作用:
这是当dll不在exe目录下时,需要通过lib文件进行查找。
4、为什么有的dll打包会有lib文件有的只有dll文件?
当接口函数的“ extern "C" __declspec(dllexport)”声明放在了.h文件,则会有lib文件生成,如果接口函数的“ extern "C" __declspec(dllexport)”直接放到cpp文件里的函数定义里则其是只有dll文件。
.