记录-linux下matlab编译so,c++调用

 

参考: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,不然会提示失败

运行结果:

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值