在 Microsoft Visual Studio 工程中使用动态库
此示例说明如何创建和配置一个简单的 Microsoft® Visual Studio® 工程,调用由 MATLAB® Coder™ 生成的动态库 (DLL)。该示例使用 Microsoft Visual Studio 2017。在 Microsoft Visual Studio 的其他版本中,所用过程可能有所不同。
生成 C 动态库
创建一个 MATLAB 函数
foo
。function c = foo(a) %#codegen c = sqrt(a); end
用
foo.m
的形式将其保存在本地可写文件夹中,例如C:\dll_test
。使用同一编译器的同一版本来生成用于编译 Microsoft Visual Studio 工程的 DLL。否则,您可能会遇到链接错误。
对于此示例,请使用 Microsoft Visual Studio 2017 编译器。要选择代码生成器使用的编译器,请在命令行中输入
mex -setup
。有关详细信息,请参阅支持和兼容的编译器。为 MATLAB 函数
foo
生成 DLL。-args
选项指定输入a
为双精度实数。codegen -config:dll foo -args {0} -report
在 Microsoft Windows® 系统上,
codegen
在默认文件夹C:\dll_test\codegen\dll\foo
下生成一个 C 动态库foo.dll
以及支持文件。
创建 Microsoft Visual Studio 工程
在 Microsoft Visual Studio 中,创建一个空白工程:
选择文件 > 新建 > 工程。
选择已安装 > Visual C++ > 常规,然后选择空白工程。输入工程名称。
点击确定。
创建使用该库的 main.c 文件
编写一个使用 foo.dll
的 main.c
文件。main.c
函数必须:
包括生成的头文件,头文件包含库函数的函数原型。
在最后一次调用库函数后调用终止函数。
默认情况下,代码生成器会在生成的 C/C++ 入口函数开始处包含一个对初始化函数的调用。因此,您不需要从 main.c
中调用初始化函数。请参阅Use Generated Initialize and Terminate Functions。
要创建该文件,请执行下列操作:
在解决方案资源管理器中,右键点击源文件文件夹,然后选择添加 > 新项目
选择 C++ 文件 (.cpp)。在名称字段中,输入
main.c
。点击添加。
输入代码:
#include "foo.h" #include "foo_terminate.h" #include <stdio.h> int main() { printf("%f\n", foo(26)); foo_terminate(); getchar(); return 0; }
配置平台
MATLAB Coder 自动使用配置为编译 64 位 DLL 的工具链。默认情况下,Microsoft Visual Studio 配置为针对 Win32 平台进行编译。您必须将编译平台更改为 x64 以匹配生成的 64 位 DLL。在 Microsoft Visual Studio 中:
选择编译 > 配置管理器。
将活动解决方案平台设置为 x64。
如果要在 64 位平台上编译 32 位 DLL,必须使用 32 位工具链定义。请参阅使用 MSVC 工具链在 64 位 Windows® 平台上编译 32 位 DLL。
指定外部依赖项
要编译您的工程译器需要相关联的头文件。链接器需要生成的 .lib
文件。
在解决方案资源管理器中突出显示您的工程,然后选择工程 > 属性。
代码生成器在文件
rtwtypes.h
中生成类型,该文件包括文件tmwtypes.h
。此文件存储在matlabroot\extern\include
中,其中matlabroot
是 MATLAB 安装的根目录。要返回根目录,请在命令行窗口中输入matlabroot
。在配置属性 > C/C++ > 常规下,将文件夹
C:\dll_test\codegen\dll\foo
和matlabroot\extern\include
添加到附加包含目录。用分号分隔条目。在配置属性 > 链接器 > 输入下,将
foo.lib
添加到附加依赖项。在配置属性 > 链接器 > 常规下,将文件夹
C:\dll_test\codegen\dll\foo
添加到附加库目录。
编译并运行可执行文件
编译可执行文件。选择编译 > 生成解决方案。
使 DLL 可供可执行文件访问。将
foo.dll
复制到包含可执行文件的文件夹中,或将包含foo.dll
的文件夹添加到您的路径中。运行可执行文件。验证输出是否与预期相符。