[C-C++]DLL之旅1 : 将程序打包成DLL

原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接:http://blog.csdn.net/humanking7/article/details/78585004


问题提出

发现Matlab中,在一个Simulink文件里有多个CS-function,而CS-function都会调用共同的自定义函数。这样会mex(Matlab调用编译器编译的一种形式,将源文件编译成Matlab-Simulink可执行的文件)这些源文件成mexw32mexw64文件,每个CS-function都是单独编译的,如果只是运行,这些mexw32并不冲突,但是如果将整个Simulink文件进行编译(xPC或是其他环境,要将整个Simulink文件编译成目标文件,下载到目标机上),这样就会出现函数重定义的链接错误

这也是很明显的事情,每个mexw32文件都会共用一些函数,而这些函数编译成的目标文件都会在mexw32中,这些拥有相同函数的的mexw32在Simulink的环境下可以单独运行,但如果合在一起进行编译,就会出现下重定义错误。

解决想法:

  1. 共用的函数重命名,虽然功能一样,但是名字不一样(简单粗暴,但是共用的函数多了就相当恶心,治标不治本) ;
  2. 将共用的函数打成动态链接库(lib、dll)。

分装DLL步骤

Step1. 新建win32的DLL项目

[C-C++]DLL之旅1 : 将程序打包成DLL_第1张图片

[C-C++]DLL之旅1 : 将程序打包成DLL_第2张图片

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.dllqShareDll.lib

[C-C++]DLL之旅1 : 将程序打包成DLL_第3张图片

Step3. 注意事项

主要就是集中在头文件上:

  • extern “C” 解决函数名由于不同编译器造成的名字匹配问题
  • 通常C++编译器编译时会对函数进行改名,而C编译器不会
  • _declspec(dllexport)说明该函数为导出函数
  • 如果函数用_stdcall进行修饰,在动态引用的时候,要对函数指针也要进行_stdcall修饰

Next计划

[C-C++]DLL之旅2 : 调用DLL(静态&动态加载)


donate

你可能感兴趣的:(C-C++)