c++学习备注4--一些错误的修改

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

你可能感兴趣的:(C++,String,function,System,dll,WinForm)