VS2008 关于封装OPENCV相关的DLL出现的错误总结

本文记录了使用VS2008托管C++开发类库过程中遇到的各种问题及解决方法,包括编译错误、类型转换错误、运行时错误等,并分享了解决这些问题的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

想用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后解决。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值