想用vs2008 中的托管c++做过类库。首先碰到了一个问题是编译出现“无法解析的外部符号错误”,以前也碰到过。忘记记下里了。
多次试验,发现去掉include “highgui.h”的引用问题就没有了。看了以前的例子,include "highgui.h"是在h文件中写的。不是写在cpp文件中。网上的方法都试遍了,也没有解决。结果发现时没有把cxcore200.lib cv200.lib highgui200.lib 放到依赖项中 。
在类中加了一个方法后又出现了“无法解析的标记错误”,这次有经验了,马上怀疑是只定义没实现有关系。以前用c++做winform程序的时候碰到过。首先要在cpp文件中using h文件中定义的namespace,然后实现这个方法就可以了。
cpp文件中如下:
// 这是主 DLL 文件。
#include "stdafx.h"
#include "WinRoutines4opencv.h"
using namespace WinRoutines4opencv;
IplImage* cvWinExt::bmp2ipl(System::Drawing::Bitmap ^bmp)
{
IplImage* img;
return img;
}
Bitmap^ cvWinExt::ipl2bmp(IplImage* image)
{
Bitmap^ bmp;
return bmp;
}
在吧char* 类型转换成string类型时也碰到些错误,“string类型无法转换成string^类型”
最后用
System::String^ cvWinExt:: charArray2string(char* ca)
{
System::String^ s=gcnew String(ca);
return s;
}搞定
做好的类库在测试的时候发现运行时错误“找不到指定的模块”,结果发现时修改了opencv的路径所至。直接复制opencv的dll到exe文件路径下就可以了。
接着在调用其中一个函数的时候又出现“候选函数不可访问”编译错误。
猜测可能也和opencv有关。因为另外两个没有使用iplImage类型的函数都正常。
测试了下确实是iplImage引起的。去掉就可以。
后来在国外的一篇文章中查到方法。在动态库的h文件中加上对自定义结构的make public申明
如下:
#pragma make_public(_IplImage)
加在h文件和cpp文件的最上面。
还有一种情况会造成候选函数不可访问是可见度修饰符造成的
在c#中 可以这么写 static public function()
在c++中,得写成
public:
static func();
否则也会类中的造成函数不可见。
现在碰到一个视乎比较难办的问题“函数在当前语言不可用”
结果发现是函数参数格式不对。function(object o),应该改成function(object^ o)这样才能把地址传进去。
测试程序可以运行了。问题又来了。调用这些个dll的c#代码似乎根本没执行。结果更加没任何变化。
重新生成测试程序。搞定。dll可以调用了。
接下去的问题是运行时出现异常。结果出不来。估计和图像格式转换,以及参数方式有关系。慢慢解决了。
2010-1-31下面把mlp封装到类库。
第一个问题是c4368,CvAnN_MLP是非托管类,不能直接封装。但可以用指针来做 CvANN_MLP * mlp,,参看微软示例。
然后碰到的是对非静态成员的非法引用问题。
原来是因为试图在静态函数里访问非静态成员造成的。把静态函数改成非静态函数就好了。
接下去又出现了无法解析的外部符号错误,参照本文前面的进行修改。
最后调用mlp->train时候又出现了runtime错误。debug后解决。