前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[C-C++]DLL之旅1 : 将程序打包成DLL

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

作者头像
祥知道
发布2020-03-10 15:17:37
2K0
发布2020-03-10 15:17:37
举报
文章被收录于专栏:祥的专栏祥的专栏

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

原文链接: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项目

p1
p1
p2
p2

Step2 代码

就两个文件:

  • 头文件: qShareDll.h
  • 源文件: qShareDll.c

Step2.1 头文件代码

代码语言:javascript
复制
#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 源文件代码

代码语言:javascript
复制
#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

b3
b3

Step3. 注意事项

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

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

Next计划

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题提出
  • 分装DLL步骤
    • Step1. 新建win32的DLL项目
      • Step2 代码
        • Step2.1 头文件代码
        • Step2.2 源文件代码
        • Step2.3 链接库
      • Step3. 注意事项
        • Next计划
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档