转自:http://blog.csdn.net/songyi160/article/details/50754705

VS2015用C++创建动态库DLL步骤如下:

(1)启动VS2015》文件》新建》项目,按下图进行选择填写,选择Win32控制台应用程序或Win32项目都可以,这两相都会弹出相同的创建窗口,如第二张图,第三张图。

(2)在Win32应用程序向导对话框中选择【下一步】

(3)按下图进行勾选

预编译头作用:VS 默认情况下会创建并使用预编译头文件(也就是自动创建 StdAfx.h 和 StdAfx.cpp 这两个文件),以便在编译时加快编译速度,预编译器将它编译后,会生成一                                     个 Pre-compiled header ,也就是 pch 文件,这样下次就可以直接使用这里已经编译好了的代码了。

(4)整个测试项目创建后,整体效果如下图:

(5)在解决方案中找到【头文件】然后右击选择【添加】》【新建项】,在弹出的添加新项对话框中进行如下选择:

(6)打开DLLTest.cpp并添加如下图红色框中的函数test1和test2,同时将DLLTest.h头文件包含进来,具体如下图:

(7)打开DLLTest.h并添加函数test1和test2的导出形式,具体如下图:

注意:__stdcall定义导出函数入口点调用约定为_stdcall

extern "C"说明导出函数使用C编译器,则函数名遵循C编译器的函数名修饰规则,不加extern "C"说明使用C++编译器的函数名修饰                    规则,两种规则区别如下:

(1)C编译器的函数名修饰规则

对于__stdcall调用约定,编译器和链接器会在输出函数名前加上一个下划线前缀,函数名后面加上一个“@”符号和其参数的字节数,例如                            _functionname@number。__cdecl调用约定仅在输出函数名前加上一个下划线前缀,例如_functionname。__fastcall调用约定在输出函                             数名前加上一个“@”符号,后面也是一个“@”符号和其参数的字节数,例如@functionname@number

(2)C++编译器的函数名修饰规则

C++的函数名修饰规则有些复杂,但是信息更充分,通过分析修饰名不仅能够知道函数的调用方式,返回值类型,甚至参数个数、参数类                            型。不管__cdecl,__fastcall还是__stdcall调用方式,函数修饰都是以一个“?”开始,后面紧跟函数的名字,再后面是参数表的开始标识                              和按照参数类型代号拼出的参数表。对于__stdcall方式,参数表的开始标识是“@@YG”,对于__cdecl方式则是“@@YA”,对于                                        __fastcall方式则是“@@YI”。参数的具体含义见上篇博客【VS2015用C++创建的动态库导出函数名乱码原因分析】。

(8)使用extern "C"导出的函数名,如图一,不使用extern "C"导出的函数名,如图二。

图一

图二

注意在图二中如果看到的函数不是图中所示,请在函数名上右击去掉对【Undecorate C++ Functions】的选择

(9)针对上面的叙述可以看出无论是添加extern "C"还是不添加,都不是我们想要的函数名,.h头文件的作用仅仅能导出动态库、明确编译链接方式及确定入口点约定,还一个重要作用是打包给开发者,使其了解动态库导出的函数及对应的的参数,为了确保导出函数名及入口点函数不变,此时需添加.def文件,步骤如下:

(10)在解决方案中找到【源文件】右击选择【添加】》【新建项】,在弹出的添加新项对话框中进行如下图所示选择:

(11)在DLLTest.def文件中写入如下代码:

使用def文件的意义:将编译器生成的函数修饰去掉,用更加自然、更加容易理解、更加容易记忆的名字来命名函数,而不是一串人一看就吓一跳的                                             修饰名字。

(12)在生成解决方案前先进行如下修改,CPU选X86还是X64随便你啦

(13)请注意一定要是Release模式而不能是Debug模式,否则生成的动态库DLL文件有可能还是不能被其他语言调用,原因现在还不清楚,有知道的朋友请留言,谢谢。为对比可查看Release文件夹和Debug文件夹中生成的动态库DLL文件的大小也是不同的。

(14)用def文件导出的动态库DLL既可以保证函数名不变也可以保证动态库DLL的入口点函数名不变,同时在.cpp文件中函数定义中加入__stdcall就可以实现导出的DLL被其它语言调用,此时.h头文件的作用仅仅打包给开发者,供其查看导出的函数名及相应参数而已。

在VS2015中用C++编写可被其它语言调用的动态库DLL的更多相关文章

  1. 在VS2015中用C++编写可被C#调用的DLL

    VS2015用C++创建动态库DLL步骤如下: (1)启动VS2015-->文件-->新建-->项目,按图二进行选择,选择Win32项目,弹出创建窗口,如第二张图.注意.net版本根 ...

  2. Qt编写自定义控件插件开放动态库dll使用(永久免费)

    这套控件陆陆续续完善了四年多,目前共133个控件,除了十几个控件参考网友开源的代码写的,其余全部原创,在发布之初就有打算将动态库开放出来永久免费使用,在控件比较完善的今天抽了半天时间编译了多个qt版本 ...

  3. vs2019 Com组件初探-简单的COM编写以及实现跨语言调用

    前提条件 1.掌握C++基础语法 2.平台安装 vs2019 3.本地平台为 windows 10 1909 X64 4.了解vbs基础语法 本次目标 1.掌握Com组件的概念及原理 2.编写一个简单 ...

  4. 【C++】第1章 在VS2015中用C++编写控制台应用程序

    分类:C++.VS2015 创建日期:2016-06-12 一.简介 看到不少人至今还在用VC 6.0开发工具学习C++,其实VC 6.0开发工具早就被淘汰了.这里仅介绍学习C++时推荐使用的两种开发 ...

  5. 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试

    from:http://m.blog.csdn.net/article/details?id=51075023 在VS2015中先创建C#项目,然后再创建要编写的动态库DLL项目,这样做的好处是整个解 ...

  6. VS2015使用C++编写DLL,并在C#环境中调用【转】

    说明:本文是本人在学习封装DLL时看到的,觉得说得很清楚,为了防止忘记,特意复制下来学习用,原文链接:https://blog.csdn.net/songyi160/article/details/5 ...

  7. 在VS2015中用C++创建DLL并用C++调用且同一时候实现对DLL的调试

    一:用C++创建DLL            依照[在VS2015中用C++编写可被其他语言调用的动态库DLL]提示创建C++编写的DLL.或參考[在VS2015中用C++创建DLL并用C#调用且同一 ...

  8. VS2015——命令行下编译、静态库动态库制作以及断点调试

    c程序编译流程 程序的基本流程如图: 1. 预处理 预处理相当于根据预处理指令组装新的C/C++程序.经过预处理,会产生一个没有宏定义,没有条件编译指令,没有特殊符号的输出文件,这个文件的含义同原本的 ...

  9. 编写ios和android共用的c/c++库时 使用iconv的问题(转)

    因为在项目中需要同时维护ios和Android,不同的代码不利于开发的便捷和以后的维护,所以在最近的一个项目中,两种手机应用的通信部分打算使用c/c++库来统一编写,ios调用.a静态库,androi ...

随机推荐

  1. jqGrid排序的两种实现方式

    实现方案一客户端实现排序: jqGrid属性 loadonce:true时,所有数据加载在客户端,点击列标题由jqGrid在客户端自动排序,不再从服务器取值. 参考文件:ccMxCxTjCc.js j ...

  2. linux如何查看某个pid的进程?

    Linux通过PID查看进程完整信息 [root@gsidc-4q-saas23 ~]# netstat -anp|grep 8282tcp 0 0 :::8282 :::* LISTEN 16923 ...

  3. 微信小程序-云开发(手记)

    微信小程序-云开发(手记) 1.创建data.json文件 注意以下几点要求: 入门示例: init方法的env:默认环境配置,传入字符串形式的环境 ID(理解为数据库)可以指定所有服务的默认环境(意 ...

  4. ondrag事件

    ondragstart 事件在用户开始拖动元素或选择的文本时触发. 拖放是 HTML5 中非常常见的功能. 更多信息可以查看我们 HTML 教程中的 HTML5 拖放. 注意: 为了让元素可拖动,需要 ...

  5. Every write operation executed on a document, deletes included

    Delete API | Elasticsearch Reference [6.5] | Elastic https://www.elastic.co/guide/en/elasticsearch/r ...

  6. 解Bug之路-TCP粘包Bug

    解Bug之路-TCP粘包Bug - 无毁的湖光-Al的个人空间 - 开源中国 https://my.oschina.net/alchemystar/blog/880659 解Bug之路-TCP粘包Bu ...

  7. nodejs(一)

    nodejs第一章节 使用node来实现第一个http服务器 var http = require(‘http’); http.createServer(function (request, resp ...

  8. 在VMWare的虚拟机中设置共享文件夹(Linux-Ubuntu系统)

    1.点击菜单中的虚拟机---设置---选项---共享文件夹,选择总是开启: 2.添加主机共享的文件夹: 3.安装vmware tools: (1)打开虚拟机---安装vmware tools: (2) ...

  9. hotspot的简单介绍

    慢慢开始深入了解java,才知道java虚拟机有很多种,其中最为知名的应该就是hotspot了,接下来是hotspot的一点简单介绍. 没错,Java是解释语言,但并不意味着它一定被解释执行.早期 的 ...

  10. 前端开发 - jsBom

    一.jsBom简介 jsBom = javascript browser object modelBOM指的是浏览器对象模型 Browser Object Model,它的核心就是浏览器. 二.Bom ...