VS2013建立C++ dll库文件
2017-08-01 08:45
302 查看
DLL是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。本文介绍了使用VS2013和C++进行动态库的编写,一方面C++运行速度之快大家有目共睹,另一方面,好多技术都是基于C++,如OPENCV ,若是用C++混合编写比其它语言较为容易,使用C++建立动态库公其他语言使用是相当划算的。
VS2013
建立一个C++的Win32DLL,这里要注意选择"Export symbols"导出符号。点击完成。 如下图所示:
![](http://g.hiphotos.baidu.com/exp/w=500/sign=7c690d22b6de9c82a665f98f5c8180d2/fd039245d688d43f69a578e9781ed21b0ef43b99.jpg)
由于项目的名称是"TestCPPDLL",因此,会自动生成TestCPPDLL.h和TestCPPDLL.cpp两个文件,.h文件是要导出内容的声明文件,为了能清楚的说明问题,我们将TestCPPDLL.h和TestCPPDLL.cpp两个文件中的所有内容都删除,然后在TestCPPDLL.h中添加如下内容:
![](http://d.hiphotos.baidu.com/exp/w=500/sign=dea677e1d4c8a786be2a4a0e5708c9c7/aa18972bd40735fa1d7499a29b510fb30f240821.jpg)
第一行代码中定义了一个名为"TESTCPPDLL_API"的宏,该宏对应的内容是"__declspec(dllexport)"意思是将后面修饰的内容定义为DLL中要导出的内容。当然你也可以不使用这个宏,可以直接将"__declspec(dllexport)"写在要导出的函数前面。
第二行中的"EXTERN_C",是在"winnt.h"中定义的宏,在函数前面添加"EXTERN_C"等同于在函数前面添加extern "C",意思是该函数在编译和连接时使用C语言的方式,以保证函数名字不变。
第二行的代码是一个函数的声明,说明该函数可以被模块外部调用,其定义实现在TestCPPDLL.cpp中,TestCPPDLL.cpp的代码如下所示:
![](http://d.hiphotos.baidu.com/exp/w=500/sign=95e20912b3003af34dbadc60052ac619/37d12f2eb9389b50ecf309498035e5dde7116e99.jpg)
第三步:
在编译C++DLL之前,需要做以下配置,在项目属性对话框中选择"C/C++"|"Advanced",将Compile AS 选项的值改为"C++"。然后确定,并编译。
![](http://g.hiphotos.baidu.com/exp/w=500/sign=1e79ac2509f3d7ca0cf63f76c21fbe3c/b17eca8065380cd7177849f6a444ad3459828143.jpg)
生成的DLL文件如下图所示:
![](http://h.hiphotos.baidu.com/exp/w=500/sign=3e386ff59982d158bb8259b1b00a19d5/9345d688d43f87944bf3a135d71b0ef41bd53a99.jpg)
第四步:
首先,添加一个C#的应用程序,如果要在C#中调用C++的DLL文件,先要在C#的类中添加一个静态方法,并且使用DllImportAttribute对该方法进行修饰,代码如下所示:
![](http://f.hiphotos.baidu.com/exp/w=500/sign=8e440fefb24543a9f51bfacc2e178a7b/7af40ad162d9f2d36a71f5f4acec8a136327cc4d.jpg)
DllImport中的第一个参数是指明DLL文件的位置,第二个参数"EntryPoint"用来指明对应的C/C++中的函数名称是什么。"extern"关键字表明该处声明的这个Add方法是一个外部调用。
该方法声明完毕之后,就可以像调用一个普通的静态方法一样去使用了。
下面是示例程序:
![](http://d.hiphotos.baidu.com/exp/w=500/sign=22a917946981800a6ee5890e813433d6/8694a4c27d1ed21bfd05c0fea86eddc450da3fd9.jpg)
8
然后运行该C#程序,其结果如下图所示:
![](http://h.hiphotos.baidu.com/exp/w=500/sign=8dbd8a24dcf9d72a1764101de42b282a/77094b36acaf2edd343da7f2881001e9380193d9.jpg)
工具/原料
VS2013
方法/步骤
建立一个C++的Win32DLL,这里要注意选择"Export symbols"导出符号。点击完成。 如下图所示:![](http://g.hiphotos.baidu.com/exp/w=500/sign=7c690d22b6de9c82a665f98f5c8180d2/fd039245d688d43f69a578e9781ed21b0ef43b99.jpg)
由于项目的名称是"TestCPPDLL",因此,会自动生成TestCPPDLL.h和TestCPPDLL.cpp两个文件,.h文件是要导出内容的声明文件,为了能清楚的说明问题,我们将TestCPPDLL.h和TestCPPDLL.cpp两个文件中的所有内容都删除,然后在TestCPPDLL.h中添加如下内容:
![](http://d.hiphotos.baidu.com/exp/w=500/sign=dea677e1d4c8a786be2a4a0e5708c9c7/aa18972bd40735fa1d7499a29b510fb30f240821.jpg)
第一行代码中定义了一个名为"TESTCPPDLL_API"的宏,该宏对应的内容是"__declspec(dllexport)"意思是将后面修饰的内容定义为DLL中要导出的内容。当然你也可以不使用这个宏,可以直接将"__declspec(dllexport)"写在要导出的函数前面。
第二行中的"EXTERN_C",是在"winnt.h"中定义的宏,在函数前面添加"EXTERN_C"等同于在函数前面添加extern "C",意思是该函数在编译和连接时使用C语言的方式,以保证函数名字不变。
第二行的代码是一个函数的声明,说明该函数可以被模块外部调用,其定义实现在TestCPPDLL.cpp中,TestCPPDLL.cpp的代码如下所示:
![](http://d.hiphotos.baidu.com/exp/w=500/sign=95e20912b3003af34dbadc60052ac619/37d12f2eb9389b50ecf309498035e5dde7116e99.jpg)
第三步:
在编译C++DLL之前,需要做以下配置,在项目属性对话框中选择"C/C++"|"Advanced",将Compile AS 选项的值改为"C++"。然后确定,并编译。
![](http://g.hiphotos.baidu.com/exp/w=500/sign=1e79ac2509f3d7ca0cf63f76c21fbe3c/b17eca8065380cd7177849f6a444ad3459828143.jpg)
生成的DLL文件如下图所示:
![](http://h.hiphotos.baidu.com/exp/w=500/sign=3e386ff59982d158bb8259b1b00a19d5/9345d688d43f87944bf3a135d71b0ef41bd53a99.jpg)
第四步:
首先,添加一个C#的应用程序,如果要在C#中调用C++的DLL文件,先要在C#的类中添加一个静态方法,并且使用DllImportAttribute对该方法进行修饰,代码如下所示:
![](http://f.hiphotos.baidu.com/exp/w=500/sign=8e440fefb24543a9f51bfacc2e178a7b/7af40ad162d9f2d36a71f5f4acec8a136327cc4d.jpg)
DllImport中的第一个参数是指明DLL文件的位置,第二个参数"EntryPoint"用来指明对应的C/C++中的函数名称是什么。"extern"关键字表明该处声明的这个Add方法是一个外部调用。
该方法声明完毕之后,就可以像调用一个普通的静态方法一样去使用了。
下面是示例程序:
![](http://d.hiphotos.baidu.com/exp/w=500/sign=22a917946981800a6ee5890e813433d6/8694a4c27d1ed21bfd05c0fea86eddc450da3fd9.jpg)
8
然后运行该C#程序,其结果如下图所示:
![](http://h.hiphotos.baidu.com/exp/w=500/sign=8dbd8a24dcf9d72a1764101de42b282a/77094b36acaf2edd343da7f2881001e9380193d9.jpg)
相关文章推荐
- VS 编写c++dll库文件
- vs2013 c++ 编译配置jsoncpp和使用jsoncpp解析json文件
- VS2013编译32位与36位的sqlite,再CMAKE生成osgearth加载mbtiles文件需要的osgdb_osgearth_mbtiles.dll
- vs2013 dll 文件的创建和引用
- VS2013 c++ 生成和调用DLL动态链接库
- VS2013创建dll动态链接库文件心得
- VS2013 中生成lib和dll库文件
- vs c++ Rebuilt 编译时不能生成 .dll文件
- VS2013下在C#中调试C++ dll
- VS2013 中生成lib和dll库文件
- C++读取OBJ文件中的数据(VS2013)
- C++ MFC / VS2013 之二 解决方案各个文件结构
- VS2013中 勾选在共享DLL中使用MFC 报错 系统找不到指定文件 参考解决办法
- VS 2013 c++ 头文件引用
- vs2013 c++ 引用头文件后出现未定义或者重定义
- VS2013 动态库编译无法启动***.dll文件
- x64下vs2013 C++遍历目录下所有文件使用_findnext()调试时中断
- VS2013 C++环境下DLL和LIB文件目录及名称修改
- VS2013生成DLL文件
- VS 编写c++dll库文件