参考:https://blog.csdn.net/qq_41990294/article/details/109154801
参考:https://www.it610.com/article/5486435.htm
记录一下:
matlab/bin路径下:sudo ./matlab 启动,不然会卡在启动界面
1、编译动态:
两个方法,我用的是LIbrary Compiler,
先运行,改变以下文件夹,方便后面,, myFunc.m 生成的动态库是 libmyFunc.so
function [ C ] = myFunc(A, B)
C = A+B;
end
打开LIbrary Compiler,我选的是C++,+.m文件,package默认就好,编译完成后在文件夹里面能看到libmyFunc.so
我matlab2018a,提示需要gcc的版本是6.3.x,,费好大功夫安装了gcc-6.3.0,,不确定有没有必要。
2、编译C++
我用g++编译一直报错,找不到libmyFunc.so,后来用的cmake才成功,不知道问题出在哪里了。
g++ test.cpp -o test -I. -I/data/MATLAB/R2018a/extern/include/ -L. -L/data/MATLAB/R2018a/runtime/glnxa64 -L. -L/data/MATLAB/R2018a/bin/glnxa64/ -lmyFunc -lm -lmwmclmcrrt -lmwmclmcr
c++主函数,把输入写死了,键盘输入比较慢,
#include <iostream>
#include "mclmcr.h"
#include "matrix.h"
#include "mclcppclass.h"
#include "libmyFunc.h"
#include "mclmcrrt.h"
using namespace std;
int main() {
// initialize lib,这里必须做初始化!
if( !libmyFuncInitialize())
{
std::cout << "Could not initialize libmyFunc!" << std::endl;
return -1;
}
// 用户输入2个数值
double a, b;
a =10;
b =20;
double c; //used to receive the result
// 为变量分配内存空间, maltab只有一种变量,就是矩阵,为了和c++变量接轨,设置成1*1的矩阵
mwArray mwA(1, 1, mxDOUBLE_CLASS); //1,1表示矩阵的大小, mxDOUBLE_CLASS表示变量的精度
mwArray mwB(1, 1, mxDOUBLE_CLASS);
mwArray mwC(1, 1, mxDOUBLE_CLASS);
// 调用类里面的SetData函数给类赋值
mwA.SetData(&a, 1);
mwB.SetData(&b, 1);
// 调用自己的函数,求和。
myFunc(1, mwC, mwA, mwB);
c = mwC.Get(1, 1);
cout<<"The sum is: "<<c<<endl;
// 后面是一些终止调用的程序
// terminate the lib
libmyFuncTerminate();
// terminate MCR
mclTerminateApplication();
return EXIT_SUCCESS;
}
CMakeLists.txt文件,需要将链接的库全路径添加进来,还有.h的路径,具体如下:根据自己的路径修改
cmake_minimum_required(VERSION 2.8)
project(main)
add_executable(main main.cpp)
set(LIBMWM /data/MATLAB/R2018a/runtime/glnxa64/)
set(PROJECT_NAME main)
include_directories( ${LIBMWM} )
# matlab
set(MATLAB_ROOT /data/MATLAB/R2018a/)
include_directories(${MATLAB_ROOT}extern/include/)
target_link_libraries(${PROJECT_NAME} /data/MATLAB/R2018a/bin/glnxa64/libmwmclmcr.so)
target_link_libraries(${PROJECT_NAME} /data/MATLAB/R2018a/runtime/glnxa64/libmwmclmcrrt.so)
target_link_libraries(${PROJECT_NAME} /home/********/test/libmyFunc/for_redistribution_files_only/libmyFunc.so)
在for_redistribution_files_only里面放CMakeLists.txt,然后cmake
mkdir bulid
cd bulid
cmake ..
#安装matlab后,cmake可能会报错,根据百度,连接一下, sudo ln -s /usr/lib/x86_64-linux-gnu/libcurl.so.4.5.0 /data/MATLAB/R2018a/bin/glnxa64/libcurl.so.4
make
sudo ./main
#我运行二进制文件的时候需要sudo,不然会提示失败
运行结果: