本文介绍如何在Dev-C++中创建和调用动态链接库(DLL)。如果涉及到VC++中不同的操作,也会进行适当的区分。
项目一:创建DLL
1、创建一个DLL类型的项目,命名为dlltest,并选择合适的路径进行保存。
2、在生成的预设置代码中,加入如下代码
在上面的代码中,我们加入了HW和func两个导出函数,以及一个DllClass(自动生成)导出类。
点击编译后,我们可以在项目文件夹中看到dlltest.dll,这就是我们需要的目标动态链接库。libdlltest.a则是VC中需要用到的lib文件。
3、extern "C"说明
可以用记事本打开libdlltest.def文件,可以看到如下内容:
加了extern "C"的HW函数地址偏移量还是HW,没有加extern "C"的func函数,地址偏移量变成了_Z4funci。这个地址在动态调用导出函数的过程中会用到。
项目二:动态调用DLL导出的函数
1、再创建一个C++项目,将项目一生成的DLL文件放入项目文件夹中:
2、使用LoadLibrary和GetProcAddress动态载入动态链接库,并调用导出的函数:
在GetProcAddress中,调用HW函数可以直接传入偏移量HW;
如果调用func函数,则要传入偏移量“_Z4funci”;因为func函数没有声明为extern "C"。
3、特别备注,当前这种方式无法使用LoadLibrary和GetProcAddress获取导出类。
因为GetProcAddress获取的是函数的地址偏移量,为了可以动态使用导出的类,必须使用将一个纯虚函数做为基类,将导出创建和销毁类的函数。具体做法如下:
动态调用:
这个方法参考文章 C++动态库导出类,及使用 ,博主未实际进行测试。
项目三:静态调用导出的类
静态调用DLL,在VC++需要头文件、DLL和对应的lib文件(即项目一中生成的 libdlltest.a)。然后再使用#pragma comment(lib,"lib文件路径")对编译器进行配置lib路径,之后再进行调用。详细过程可以参考 《c++生成DLL并调用》 。
本文着重讨论Dev-C++下的静态调用。对于MinGW64静态调用DLL,只需要DLL文件和相关的头文件,项目结构如下:
其中main.cpp中调用类的代码如下:
可以看到,无需在代码中进行任何设置。因为只有在链接的过程C++才会去找DllClass这个类的真实地址。
在编译成exe时,有如下两种方法:
方法一、可以使用命令行进行编译:
通过cmd进入main.cpp所在文件夹路径,运行: g++ -o main.exe main.cpp -I . -L . -ldlltest
即可编译生成可执行文件exe。编译参数说明如下:
-I搜索头文件的目录
-I .在当前文件夹下搜索头文件
-L搜索动态库的目录
-L .在当前文件夹下搜索动态库
方法二、将参数加入编译选项中:
如果觉得用命令行编译太麻烦,可以将-I -L和-l加入Dev-C++的编译器选项中。
这样点击“编译运行”就可以正确找到对应的DLL进行编译链接,正确生成exe文件。
本文关于Dev-C++创建并调用动态链接库DLL到这里就结束了,欢迎大家指正:)
标签:游戏攻略