matlab与C混合编程问题, 顺带散分

freshui 2007-07-03 01:23:52
我用用matlab里面的mex把C编写的库文件改写成matlab版本的dll库

现在有个问题:

1. 用mex将头文件和lib库重写下, 编译链接通过, matlab中运行也通过. C版本的api接口函数的实现代码是在lib中的

2. 用mex将头文件和lib库以及dll库用上述方法, 编译可过, 无法链接, 经典的2019问题.
这种情况下的lib库函数接口好像是调用dll中的实现代码(只是通过ultredit打开lib文件猜测的, 查看dll文件的接口发现接口的实现代码在dll中), lib库的接口函数只是一个call动态链接库dll的过程.
而用vc建一个dll工程,直接将用于matlab的mex版本code编译成dll库可以通过(这样的dll matlab不能使用), mex自己编译则不可以

是否mex编译不支持这种调用的lib库再调用dll库的编译方法?
...全文
880 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
我啃 2007-07-10
  • 打赏
  • 举报
回复
jf
argenCHN 2007-07-10
  • 打赏
  • 举报
回复
up
freshui 2007-07-03
  • 打赏
  • 举报
回复
dll 应该是运行时刻才链接的
我现在编译链接为什么会出错? 有些搞不懂啊
freshui 2007-07-03
  • 打赏
  • 举报
回复
现在C版本的api是通过lib作中介来调用dll,
要把这些c版本的api改成matlab的, 直接用lib编译是不行的
jixingzhong 2007-07-03
  • 打赏
  • 举报
回复
曾经试过 VC 中调用 matlab,
没有试过 matlab 调用dll ...

楼主再找点资料看看吧 。。。
jixingzhong 2007-07-03
  • 打赏
  • 举报
回复
参看一下:

matlab调用DLL中的函数
【http://www.cnweblog.com/bigstone1998/archive/2006/11/05/179469.aspx】

首先,这种调用在 Matlab 的帮助文档中有说明。它的英文名称为:

MATLAB Interface to Generic DLLs

从这个帮助文档,我们不难看出,整个过程为:加载 DLL ,调用相关函数,和卸载 DLL 。

看起来简单,但是在实际操作中遇到了如下几个问题:



1, loadlibrary 出错。错误报告为:

Error using ==> loadlibrary Failed to preprocess input file. Output from preprocessor is: 'c:\program' is not recognized as an internal or external command, operable or batch file

错误的原因很简单,就是 loadlibrary 的问题。由于你的 matlab 是安装在 C:\program file 目录下,中间有一个空格。所以出错了。这在 Matlab R14sp2 及其以前的版本都有这个问题。



解决办法:

- 重新安装 matlab ,换一个目录,中间不带空格。

- 或者依照如下方法修改 loadlibrary.m 文件(参考: http://www.ids-spa.it/page.php?f=108&id_div=7 )



modify

line 168 of loadlibrary.m in toolbox\matlab\general from:

cc=[lcc ' -noregistrylookup' ccinclude ' -E "' header '"'];

to:

cc=['"' lcc '" -noregistrylookup' ccinclude ' -E "' header '"']; If your header has #include statements, then it might also be necessary to modify the following lines:



line 106 from:

ccinclude = [ccinclude ' -I ' fullfile(matlabroot, 'extern','include')];

to:

ccinclude = [ccinclude ' -I "' fullfile(matlabroot,'extern','¬include"')];



line 166 from:

ccinclude = [ccinclude ' -I ' fullfile(matlabroot,'sys',...

'lcc','include')];

to:

ccinclude = [ccinclude ' -I "' fullfile(matlabroot,'sys',...

'lcc','include"')];

The line numbers might be different in previous releases, but the changes are the same



注意:千万注意其中的空格。否则, matlab 告诉出错,可不要挠头。



2, loadlibrary 成功了。但是查询 libfunctions 或卸载 unloadlibrary 不成功。

怪了。我仔细看了看 loadlibrary 中的头文件。由于我写 DLL 的时候提供的头文件是给 VC 用的,所以其中有些是 VC 环境中自定义的东西。我把这个头文件改了改,把 DLL 相关的部分给注释掉,如:



#ifdef DATATRANSFER_API

//#define DATATRANSFER_API extern "C" __declspec(dllexport)

#else

#define DATATRANSFER_API extern "C" __declspec(dllimport)

#endif

/* return 0 if false, 1 if true

* Create named mutex and maped file. All success, return 1.

* After the preparation, attention that the content of the filemap is unchanged.

*/

//DATATRANSFER_API

int GYZPrepare(void);

如上面,把这个 DLL 相关的注释掉,就剩下一个简单的 .h 文件。呵呵,这样就通过了。
jixingzhong 2007-07-03
  • 打赏
  • 举报
回复
extern "C" 修饰防止名字被修改 ...
我啃 2007-07-03
  • 打赏
  • 举报
回复
mark
ouyh12345 2007-07-03
  • 打赏
  • 举报
回复
抄自msdn
ouyh12345 2007-07-03
  • 打赏
  • 举报
回复
导致 LNK2019 的常见问题有:

符号声明包含拼写错误,以致于符号声明与符号定义不同。

使用了一个函数,但其参数的类型或数量与函数定义不匹配。

函数声明使用和函数定义使用中的调用约定(__cdecl、__stdcall 或 __fastcall)不同。

符号定义在编译为 C 程序的文件中,而符号是在 C++ 文件中不带 extern "C" 修饰符声明的。

符号定义为静态,但稍后在文件外部被引用。与 C 不同,在 C++ 中全局常数具有 static 链接。若要避免此限制,可以将 const 初始化包括在头文件中,并将此头包括在 .cpp 文件中,也可以使变量成为非常数,然后使用常数引用访问它。

没有定义静态类成员。
believefym 2007-07-03
  • 打赏
  • 举报
回复
mark
星羽 2007-07-03
  • 打赏
  • 举报
回复
我来吹吹五月的风
freshui 2007-07-03
  • 打赏
  • 举报
回复
我查了下
里面的一堆函数都在dll中,
lib文件中是一堆:
_OsEventCreate@4 WDAPI810.dll WDAPI810.dll/ 1155640944 0 49
这样的东西

_OsEventCreate
这样的东西在dll文件中是看得到的
ReverseEngineering 2007-07-03
  • 打赏
  • 举报
回复
调用的lib库再调用dll库的编译方法!!!!!?????

真的没听过,不可能吧?!

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧