最近需要制作一个C的插件,需要使用MATLAB代码,所以想通过C语言调用MATLAB的动态链接库实现。以下实现过程参考了MATLAB的help~
编译环境:MATLAB2014a、Visual Studio2010
- 首先,在MATLAB中新建一个.m文件,命名为dll_test.m并保存,内容如下:
function c = dll_test(a) %#codegen
c = sqrt(a);
end
-
使用codegen命令生成DLL:
这里先简单介绍一下codegen命令:
- codegen命令用于从MATLAB代码获取C/C++代码,常见的两种命令格式:
其中第一种用于处理文件,第二种用于处理工程;参数args表示示例输入,并不进行真正的参数传递;参数files是生成C/C++时需要包含的文件(.c/.cpp/.h/.obj/.lib/.tmf);options规定了生成的目标代码类型(dll/exe/lib/mex),命令为-config:dll(其他类似),具体命令解析可以在MATLAB命令行输入help codegen查看;codegen options file file1_name args...filen_name args codegen project_name
- codegen命令用于从MATLAB代码获取C/C++代码,常见的两种命令格式:
- 将当前路径更改为.m文件的保存路径,然后在命令行中输入以下命令:
其中-report可以产生一份生成状态的报告:生成成功后的文件或错误报告;生成错误的话,重选路径,注意args与参数{0}之间有空格,多个参数空格分隔;codegen -report -config:dll dll_test -args {0}
- 上一步成功之后在目录./codegen/dll/dll_test下可以看到生成的所有文件。在VS2010下新建一个控制台工程,将之前生成的依赖文件dll_test.dll拷贝到工程目录下,并且添加一个c/c++文件到工程中,内容如下:
#include "dll_test.h" #include "dll_test_initialize.h" #include "dll_test_terminate.h" #include <stdio.h> int main() { dll_test_initialize(); printf("%f\n", dll_test(25)); dll_test_terminate(); //gerchar(); return 0; }
- VS默认配置是Win32 Debug模式,根据你之前生成的DLL,选择win32 Release还是x64 Release;
- 选中VS项目,右键->属性,选择C/C++ ->常规->附加包含目录,添加目录 ./codegen/dll/dll_test;选择链接器->常规->附加库目录,添加路径同上;选择链接器->输入->附加依赖项,将dll_test.lib加入;确定;
- VS配置完成,完美运行~