由于项目需要,要把faster_rcnn的MATLAB代码封装成dll,中间自己也遇到了很多问题,最后终于完成任务,以下是自己的编译心得,写的有不明白的可以留言讨论。转载请注明出处!
1、首先修改MATLAB代码可以传入或传出参数,根据代码的具体要求进行修改你的MATLAB代码。
2、其次确保MATLAB代码中的命令窗口可以使用deploytool命令,如果不能使用,请百度(很容易找到,不提供了)
确保你的所有代码都在包含的路径中,在命令窗口输入deploytool命令,会提示
对话框,选择对话框中的Library Compiler选项,然后弹出对话框如下:
选择C++shared Library,点击‘+’选择入口文件,选择 runtime included package,下面运行程序所需的文件会自动添加(文件多的话 需要1秒钟),如果没有添加,你可以手动添加。检查添加没问题的话,直接点击右上角的Package按钮,等待即可。等编译完成后,会生成3个文件夹,选择for_redistribution_files_only文件夹,里面有你需要的lib与dll,在for_redistribution中,可以运行安装MyAppInstaller_mcr.exe。
以上是MATLAB编译dll部分。
在没有MATLAB的电脑上运行,需要安装MATLAB Compiler Runtime 在安装的MATLAB里可以找到相应的.exe文件,运行即可
建立工程时,在属性页,vc++目录中,添加安装MATLAB Compiler Runtime的lib及include,以及你的MATLAB代码编译的库即可。在连接器,输入,附加依赖项中,添加mclmcrrt.lib
mclmcr.lib
libeng.lib
libmx.lib
libmex.lib
libmat.lib
gpu.lib(需要gpu的话)
及你MATLAB代码编译好的库即可。
做c++接口函数时,主要需要注意的是所有的传入与传出参数类型都必须是mwArray类型,需要把你的参数类型需改为此类型。
string file转换为mwArray:mwArray test_dir(file.c_str());
mwArray threshold(25, 1, mxDOUBLE_CLASS);double throld;(25和1是矩阵的大小)
throld = threshold(t1, 1);类似这样。
需要添加的头文件#include “mclmcrrt.h” #include “mclmcr.h” #include “mclcppclass.h”
以及MATLAB代码编译生成的.h文件。