您的位置:首页 > 其它

VS2015的DLL工程相关问题记录

2018-01-19 19:50 197 查看

VS2015的DLL工程相关问题记录

笔者最近在github上下载一份关于LBM流体算法代码,接着就是环境调试。作为一个C++的初学者,遇到不少的问题,就DLL工程这部分记录下来,避免后来者跳进同样的坑。

1 为什么要使用DLL工程?

动态链接库(DLL)可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。简单来讲,就是当另一个工程需要调用这个模块某些功能的时候,不用担心函数名,宏定义等和自己的代码冲突的问题,因为DLL是二进制的。同时,和静态链接库一样是共享程序代码的一种方式。不同的是,静态链接库是在编译时利用lib文件生成的可执行文件,并包含了完整的代码实现;而动态链接库则是lib文件包含了函数所在的dll和dll中函数位置的入口信息,并在可执行文件运行时由dll文件提供具体的代码。更简单点讲,就是使用库的方式别人(其他工程)可以方便的使用你的函数与功能,还不会窃窥到你的代码。

2 创建一个DLL工程

方法一:网上很多文章都是说:新建--》项目--》选择DLL项目。但是,笔者这样操作会提示“无法找到合适的SDK”,而无法完成创建。不太明白怎么回事,网上说重装。。。
方法二:也就是微软官方给出的教程,连接如下:https://msdn.microsoft.com/zh-cn/library/ms235636.aspx
官方是先创建win32项目,再在项目--》属性--》配置属性--》常规--》配置类型  选择动态库,不过记得随便改一下字符集为Unicode。

3 导出和导入

笔者之前在编译时,一直遇到错,后来发现这些错误的文件都包含如下的部分:
#ifdef LBM_GL_CPP_EXPORTS
#define FW_API __declspec(dllexport)
#else
#define FW_API __declspec(dllimport)
#endif

明明只需要用到dllexport 就行,为什么还要加上一个dllimport呢?
首先看看这几行代码的意思:无非是如果定义了LBM_GL_CPP_EXPORTS就定义FW_API为 ____declspec(dllexport) ;否则就定义FW_API为__declspec(dllimport) 。两者的区别就在于,前者告诉编译器FW_API所定义的都是我要导出的!你要给我找到完整的代码实现,给我导出到dll文件中;而后者则告诉编译器FW_API所定义的都是我要从别处导入的!!别在本项目里面找具体实现了,你找不到的!别给我瞎报错!
而用ifdef的方式写在一起的好处就在于:如果开发者在预处理器定义里定义了LBM_GL_CPP_EXPORTS,我就是导出;反之,导入。有木有发现两个功能的切换,不需要改代码!!!方便啊!!

4 链接

一般采用隐式链接需要配置3个东西:
(1)在链接中的 输入项中加入lib文件。
(2)配置引用lib的目录。
(3)配置引用头文件的目录。
既然是在其他工程加载dll文件,,理所当然不能定义LBM_GL_CPP_EXPORTS。具体的操作在上面链接(也可以点击链接)也有说明。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: