原创文章,欢迎转载。转载请注明:转载自 祥的博客
原文链接:http://blog.csdn.net/humanking7/article/details/78585004
问题提出
发现Matlab中,在一个Simulink文件里有多个CS-function,而CS-function都会调用共同的自定义函数。这样会mex(Matlab调用编译器编译的一种形式,将源文件编译成Matlab-Simulink可执行的文件)这些源文件成mexw32或mexw64文件,每个CS-function都是单独编译的,如果只是运行,这些mexw32并不冲突,但是如果将整个Simulink文件进行编译(xPC或是其他环境,要将整个Simulink文件编译成目标文件,下载到目标机上),这样就会出现函数重定义的链接错误。
这也是很明显的事情,每个mexw32文件都会共用一些函数,而这些函数编译成的目标文件都会在mexw32中,这些拥有相同函数的的mexw32在Simulink的环境下可以单独运行,但如果合在一起进行编译,就会出现下重定义错误。
解决想法:
- 共用的函数重命名,虽然功能一样,但是名字不一样(简单粗暴,但是共用的函数多了就相当恶心,治标不治本) ;
- 将共用的函数打成动态链接库(lib、dll)。
分装DLL步骤
Step1. 新建win32的DLL项目
Step2 代码
就两个文件:
- 头文件: qShareDll.h
- 源文件: qShareDll.c
Step2.1 头文件代码
#ifndef _Q_SHARE_DLL_H
#define _Q_SHARE_DLL_H
extern "C" _declspec(dllexport) double qAdd(double a, double b);
extern "C" _declspec(dllexport) double qSub(double a, double b);
// extern "C" 解决函数名由于不同编译器造成的名字匹配问题
// 通常c++编译器编译时会对函数进行改名,而c编译器不会
// _declspec(dllexport)说明该函数为导出函数
/*
如果函数用"_stdcall"进行修饰,在动态引用的时候,要对"函数指针"也要进行"_stdcall"修饰
__stdcall:Windows API默认的函数调用协议
extern "C" _declspec(dllexport) double _stdcall qAdd(double a, double b);
extern "C" _declspec(dllexport) double _stdcall qSub(double a, double b);
*/
#endif
Step2.2 源文件代码
#include "qShareDll.h"
double qAdd(double a, double b)
{
return a + b;
}
double qSub(double a, double b)
{
return a - b;
}
Step2.3 链接库
编译得到qShareDll.dll和qShareDll.lib
Step3. 注意事项
主要就是集中在头文件上:
- extern “C” 解决函数名由于不同编译器造成的名字匹配问题
- 通常C++编译器编译时会对函数进行改名,而C编译器不会
- _declspec(dllexport)说明该函数为导出函数
- 如果函数用_stdcall进行修饰,在动态引用的时候,要对函数指针也要进行_stdcall修饰
Next计划
[C-C++]DLL之旅2 : 调用DLL(静态&动态加载)