[C-C++]DLL之旅1 : 将程序打包成DLL
来源:互联网 发布:爱的算法 txt 编辑:程序博客网 时间:2024/05/22 14:00
原创文章,欢迎转载。转载请注明:转载自 祥的博客
原文链接: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_Hextern "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(静态&动态加载)
阅读全文
0 0
- [C-C++]DLL之旅1 : 将程序打包成DLL
- C#将dll打包到程序中技巧之二
- C#将dll打包到程序中
- 用VS2010将C程序做成动态链接库dll
- 【Cygwin】编译c程序成dll文件
- matalb7与VC2008混合编程DLL方法(一)m函数打包成C\C++DLL库
- c#调用c程序dll
- c#程序调用c++dll
- MATLAB打包成dll文件,被c/c++调用过程
- C++DLL
- C程序DLL调用。砸七烂八的C。
- 如何将dll打包成cab
- c++DLL 学习之路
- c++DLL 学习之路
- c++DLL 学习之路
- 将c代码编译成dll文件
- C++Builder将对话框封装进Dll
- C#将dll打包到程序中技巧之一
- 安装Spark+hadoop,spark、hadoop分布式集群搭建...(亲自搭建过!!)
- Eclipse调试JDK源码看不到变量
- css更改placeholder的样式
- Invalid <url-pattern> [xxx] in servlet mapping
- mac 运行spring boot 启动运行慢解决方法
- [C-C++]DLL之旅1 : 将程序打包成DLL
- 避免在sql的where中对字段进行转换(函数转换/操作符转换/隐式转换)------索引会失效从而导致慢查询
- ArcGis10.0常见错误及解决
- 再次用construct 2制作游戏
- eclipse的jsp文件中option里嵌套<c:if></c:if>标签飘红问题的解决
- 冯某某诉昆明尊园房地产经纪有限公司居间合同纠纷一审民事判决书
- 在Images.xcassets 只能用 imageNamed 加载里边的素材 其他方法 你就别费老劲了
- Sublime Text2中的快捷键一览表(Sublime 键盘快捷键大全 )
- linux下解压tar.xz 和tar.xz .gz内核文件