一、def文件说明
通常我们编写动态链接库时,一般使用的都是vc或vs等相关的集成开发环境。在编写的过程中,当使用__stdcall 标准方式调用时,有一个问题是经常遇到的,那就是导出的函数名的问题。 在vc或vs相关集成开发环境下,有许多相关的文档,说明了解决问题的方法,这里不再赘述。由于工作的原因,需要在Eclipse for C/C++上编写相应的动态库文件。经过两天的摸索尝试,找到一种解决导出函数名问题的方法。
由于习惯性的认识,原以为.def文件是VC++或VS中特有的文件格式,刚开始并没有想到使用.def文件。尝试了各种组合方式,始终无法解决extern “C” 和 __stdcall之间调用约定的冲突。
无意间想到,.def文件是VC++编译链接时用到。可以尝试添加一个.def文件,在Eclipse编译链接时,链接到相应.def文件。尝试中发现.def文件影响到编译的结果。说明.def文件还是可以在Eclipse建立的共享库工程中使用的。
通过对比结果,和调试时提示的问题原因,尝试了几种组合方式,找到了下面的解决方式:
例如:
1、只有一个.cpp源文件时,使用extern “C”放在声明的导出函数的前面。
2、在.h头文件中,有如上两种方式来声明导出函数。
在.cpp源文件中,不再需要添加extern “C”来限制函数的实现。
二、 此外,下面介绍def文件的使用方法和注意事项。
1、在项目dllTest工程中添加.def文件,添加方法,和添加.h文件、.cpp文件方式一样。但这里要注意: 右击–>“新建”–>“文件”,填写项目名称。
2、编写def文件格式和内容,如下图所示:
(可以使用分号“;”来添加注释说明,可以使用LIBRARY来指明动态链接库内部名称—可以不指定)
三、def文件的使用
1 、如前面所述:def在程序链接的时候被使用。步骤如下:
“项目”–>“属性 ”–>“C/C++构建”–>“设置”–>“工具设置”
2、 在“设置”对话框中,选择“MinGW C++链接器”中的“杂项”,在右面下边的对话框中“点击”“其他对象”后面的第一个图标
“添加…”
3、弹出下面的对话框,点击“工作空间…”按钮,选择文件目录中的def文件
4、工作空间中的def文件,点击“确定”。
5、弹出下面的对话框,点击“确定”。
6、在MinGW C++链接器,“杂项”对应的对话框中出现了def对应的目录,如下图所示。点击“确定”,完成设置。
四、修改生成文件的名称(前缀和后缀)
在默认情况下,大部分的集成开发环境,生成的dll文件的名称和工程名相同,以dll为后缀。
在Eclipse for C/C++中,默认情况下,生成的dll文件的名称有一个“lib”前缀加工程名称和“dll”后缀。下面介绍更改生成文件名称的方法。
1、“项目”–>“属性”–>“C/C++构建”–>“设置”–>“构建工作”。
2、修改方式:
工件类型:共享库(根据你创建的工程类型而定)。
工件名称:${ProjName}(默认工程名称),可自定义。
工件扩展:dll
输出前缀:lib(没有前缀,删除lib,此框为空)
根据项目的要求,自行更改,例如下图所示: