C++调用matlab中自己编写的函数

huanle543 2015-10-26 04:22:58
我在C++编写了一个工程,它中间某步需要调用我在matlab中编写的一个函数(该函数很长且用matlab编方便些,所以没有转换成C++)。我按照网上的教程(http://www.zyh1690.org/c-calling-matlab-generated-dynamic-link-library/)修改了之后,新建一个C++工程测试是成功的。但是当我加入到原有的C++工程中并设置为x64时,却会出现未定义的外部函数错误(这个函数是原C++工程中的函数)。
是因为我原有的C++工程文件是win32平台的原因么?我在网上查了很久,一直都没有找到解决方法,希望有大神可以帮我解惑!谢谢!!
...全文
740 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
paschen 2015-10-27
  • 打赏
  • 举报
回复
确实需要x64平台,很多方式可以调用matlab函数,我之前试过生成dll(当然包括h文件和lib文件),然后调用成功了 楼主可以看下《matlab与c/c++混合编程》这本书,上面说的很详细,一般照着做就成功了
赵4老师 2015-10-27
  • 打赏
  • 举报
回复
int j=100000;
while (j>0) {
    ofstream out("G:\\seu\\高频涂覆材料\\修改2\\a.txt");
    out<<inc_Angle;
    out.close();
    rename("G:\\seu\\高频涂覆材料\\修改2\\a.txt","G:\\seu\\高频涂覆材料\\修改2\\aa.txt");
    ifstream fin;
    do
    {
        fin.open("G:\\seu\\高频涂覆材料\\修改2\\bb.txt",ios::in);
        Sleep(100);//延迟100毫秒
    } while (!fin);
    fin>>S_Para[0]>>S_Para[1]>>S_Para[2]>>S_Para[3];
    fin.close();
    remove("G:\\seu\\高频涂覆材料\\修改2\\bb.txt");
    j--;
}


clear all;
clc
j = 100000;
while(j>0)
    if(exist('G:\seu\高频涂覆材料\修改2\aa.txt','file') ==2)
        temp1 = load('G:\seu\高频涂覆材料\修改2\aa.txt');
        temp2 = get_Spara2(temp1(1));
        fp = fopen('G:\seu\高频涂覆材料\修改2\b.txt','wt');
        for i =1:2
            for k = 1:2
                fprintf(fp,'%f\n',temp2(i,k));
            end
        end
        fclose(fp);
        movefile('G:\seu\高频涂覆材料\修改2\b.txt','G:\seu\高频涂覆材料\修改2\bb.txt');
        delete('G:\seu\高频涂覆材料\修改2\aa.txt');
    else
        Sleep(100);//延迟100毫秒,请用matlab适用的语句代替
    end   
    j = j-1;
end
赵4老师 2015-10-27
  • 打赏
  • 举报
回复
clear all;
clc
j = 100000;
while(j>0)
    if(exist('G:\seu\高频涂覆材料\修改2\aa.txt','file') ==2)
        temp1 = load('G:\seu\高频涂覆材料\修改2\aa.txt');
        temp2 = get_Spara2(temp1(1));
        fp = fopen('G:\seu\高频涂覆材料\修改2\b.txt','wt');
        for i =1:2
            for k = 1:2
                fprintf(fp,'%f\n',temp2(i,k));
            end
        end
        fclose(fp);
        delete('G:\seu\高频涂覆材料\修改2\aa.txt');
        movefile('G:\seu\高频涂覆材料\修改2\b.txt','G:\seu\高频涂覆材料\修改2\bb.txt');
    else
        Sleep(100);//延迟100毫秒,请用matlab适用的语句代替
    end   
    j = j-1;
end
paschen 2015-10-27
  • 打赏
  • 举报
回复
引用 9 楼 huanle543 的回复:
[quote=引用 7 楼 paschen 的回复:] 确实需要x64平台,很多方式可以调用matlab函数,我之前试过生成dll(当然包括h文件和lib文件),然后调用成功了 楼主可以看下《matlab与c/c++混合编程》这本书,上面说的很详细,一般照着做就成功了
我在网上找了通过动态链接库调用matlab的方法,在简单的测试程序里是成功的,但可能因为我要用的c++程序是win32平台的,所以改成x64之后原程序就会出现问题。请问你当时的程序复杂么?原本是win32平台么?[/quote] 我记得我当时在VS里需要用X64平台下才行,楼主再研究一下,这方面网上东西不多,而且很乱,每个版本的matlab还可能会有不同
赵4老师 2015-10-27
  • 打赏
  • 举报
回复
引用 8 楼 huanle543 的回复:
[quote=引用 5 楼 zhao4zhong1 的回复:]
int j=100000;
while (j>0) {
    ofstream out("G:\\seu\\高频涂覆材料\\修改2\\a.txt");
    out<<inc_Angle;
    out.close();
    rename("G:\\seu\\高频涂覆材料\\修改2\\a.txt","G:\\seu\\高频涂覆材料\\修改2\\aa.txt");
    ifstream fin;
    do
    {
        fin.open("G:\\seu\\高频涂覆材料\\修改2\\bb.txt",ios::in);
        Sleep(100);//延迟100毫秒
    } while (!fin);
    fin>>S_Para[0]>>S_Para[1]>>S_Para[2]>>S_Para[3];
    fin.close();
    remove("G:\\seu\\高频涂覆材料\\修改2\\bb.txt");
    j--;
}


clear all;
clc
j = 100000;
while(j>0)
    if(exist('G:\seu\高频涂覆材料\修改2\aa.txt','file') ==2)
        temp1 = load('G:\seu\高频涂覆材料\修改2\aa.txt');
        temp2 = get_Spara2(temp1(1));
        fp = fopen('G:\seu\高频涂覆材料\修改2\b.txt','wt');
        for i =1:2
            for k = 1:2
                fprintf(fp,'%f\n',temp2(i,k));
            end
        end
        fclose(fp);
        movefile('G:\seu\高频涂覆材料\修改2\b.txt','G:\seu\高频涂覆材料\修改2\bb.txt');
        delete('G:\seu\高频涂覆材料\修改2\aa.txt');
    else
        Sleep(100);//延迟100毫秒,请用matlab适用的语句代替
    end   
    j = j-1;
end
我只想在需要调用到matlab中的函数时才读写文件,因为除了读写文件之外c++程序还有很多其它的工作要做,而且如果不进行其它的相关工作,那就得不到要写到txt中的数据,请问这种情况应该怎么办呢?谢谢![/quote] 在需要调用matlab的时候,调用以下函数:
void call_matlab() {
    ofstream out("G:\\seu\\高频涂覆材料\\修改2\\a.txt");
    out<<inc_Angle;
    out.close();
    rename("G:\\seu\\高频涂覆材料\\修改2\\a.txt","G:\\seu\\高频涂覆材料\\修改2\\aa.txt");
    ifstream fin;
    int i=0;
    do
    {
        fin.open("G:\\seu\\高频涂覆材料\\修改2\\bb.txt",ios::in);
        Sleep(100);//延迟100毫秒
        i++;
        if (i>300) {
            cerr<<"调用matlab 30秒超时!"<<endl;
            break;
        }
    } while (!fin);
    fin>>S_Para[0]>>S_Para[1]>>S_Para[2]>>S_Para[3];
    fin.close();
    remove("G:\\seu\\高频涂覆材料\\修改2\\bb.txt");
}
huanle543 2015-10-27
  • 打赏
  • 举报
回复
引用 7 楼 paschen 的回复:
确实需要x64平台,很多方式可以调用matlab函数,我之前试过生成dll(当然包括h文件和lib文件),然后调用成功了 楼主可以看下《matlab与c/c++混合编程》这本书,上面说的很详细,一般照着做就成功了
我在网上找了通过动态链接库调用matlab的方法,在简单的测试程序里是成功的,但可能因为我要用的c++程序是win32平台的,所以改成x64之后原程序就会出现问题。请问你当时的程序复杂么?原本是win32平台么?
huanle543 2015-10-27
  • 打赏
  • 举报
回复
引用 5 楼 zhao4zhong1 的回复:
int j=100000;
while (j>0) {
    ofstream out("G:\\seu\\高频涂覆材料\\修改2\\a.txt");
    out<<inc_Angle;
    out.close();
    rename("G:\\seu\\高频涂覆材料\\修改2\\a.txt","G:\\seu\\高频涂覆材料\\修改2\\aa.txt");
    ifstream fin;
    do
    {
        fin.open("G:\\seu\\高频涂覆材料\\修改2\\bb.txt",ios::in);
        Sleep(100);//延迟100毫秒
    } while (!fin);
    fin>>S_Para[0]>>S_Para[1]>>S_Para[2]>>S_Para[3];
    fin.close();
    remove("G:\\seu\\高频涂覆材料\\修改2\\bb.txt");
    j--;
}


clear all;
clc
j = 100000;
while(j>0)
    if(exist('G:\seu\高频涂覆材料\修改2\aa.txt','file') ==2)
        temp1 = load('G:\seu\高频涂覆材料\修改2\aa.txt');
        temp2 = get_Spara2(temp1(1));
        fp = fopen('G:\seu\高频涂覆材料\修改2\b.txt','wt');
        for i =1:2
            for k = 1:2
                fprintf(fp,'%f\n',temp2(i,k));
            end
        end
        fclose(fp);
        movefile('G:\seu\高频涂覆材料\修改2\b.txt','G:\seu\高频涂覆材料\修改2\bb.txt');
        delete('G:\seu\高频涂覆材料\修改2\aa.txt');
    else
        Sleep(100);//延迟100毫秒,请用matlab适用的语句代替
    end   
    j = j-1;
end
我只想在需要调用到matlab中的函数时才读写文件,因为除了读写文件之外c++程序还有很多其它的工作要做,而且如果不进行其它的相关工作,那就得不到要写到txt中的数据,请问这种情况应该怎么办呢?谢谢!
huanle543 2015-10-26
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
你好,可以再请教你一下这个文本文件的问题么?我用文本这个方法编了程序,可是它只能算一个数据,然后c++ 程序就会停在创建a.txt这步,文件夹里一直都是a.txt。 这是我c++部分代码:
ofstream out("G:\\seu\\高频涂覆材料\\修改2\\a.txt");
	out<<inc_Angle;
	out.close();
	rename("G:\\seu\\高频涂覆材料\\修改2\\a.txt","G:\\seu\\高频涂覆材料\\修改2\\aa.txt");
	ifstream fin;
	do 
	{
		fin.open("G:\\seu\\高频涂覆材料\\修改2\\bb.txt",ios::in);
	} while (!fin);
	fin>>S_Para[0]>>S_Para[1]>>S_Para[2]>>S_Para[3];
	fin.close();
	remove("G:\\seu\\高频涂覆材料\\修改2\\bb.txt");
这是我matlab部分代码:
clear all;
clc
j = 40000000000000000;
while(j>0)
    if(exist('G:\seu\高频涂覆材料\修改2\aa.txt','file') ==2)
        temp1 = load('G:\seu\高频涂覆材料\修改2\aa.txt');
        temp2 = get_Spara2(temp1(1));
        fp = fopen('G:\seu\高频涂覆材料\修改2\b.txt','wt');
        for i =1:2
            for k = 1:2
                fprintf(fp,'%f\n',temp2(i,k));
            end
        end
        fclose(fp);
        movefile('G:\seu\高频涂覆材料\修改2\b.txt','G:\seu\高频涂覆材料\修改2\bb.txt');
        delete('G:\seu\高频涂覆材料\修改2\aa.txt');
    end   
    j = j-1;
end
谢谢!!
huanle543 2015-10-26
  • 打赏
  • 举报
回复
引用 2 楼 zhao4zhong1 的回复:
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
这个我在网上看到过,我的程序里需要调用几百次函数,如果这样子编写是不是会大大增加程序的运行时间呢?
赵4老师 2015-10-26
  • 打赏
  • 举报
回复
不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件,或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如: A将请求数据写到文件a.txt,写完后改名为aa.txt B发现aa.txt存在时,读取其内容,调用相应功能,将结果写到文件b.txt,写完后删除aa.txt,改名为bb.txt A发现bb.txt存在时,读取其内容,读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境,B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢? 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多,下面仅列出我现在能想到的: ·进程之间松耦合 ·进程可在同一台机器上,也可跨机,跨操作系统,跨硬件平台,甚至跨国。 ·方便调试和监视,只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务,只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务,而且几乎不可能发生队列满的情况(除非硬盘空间满) ·…… “跨语言、跨机,跨操作系统,跨硬件平台,跨国,跨*.*的”苦海无边, 回头是“使用共享纯文本文件进行信息交流”的岸!
huanle543 2015-10-26
  • 打赏
  • 举报
回复
所用平台为:VS2010 x64 ,Matlab 2012b x64

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧