全部博文(60)
分类: C/C++
2011-03-02 20:28:44
存在两种方法从DLL中导出函数:
l 隐含地导出(implicitly):大多数情况都采用此种方法,因为简单易操作。
创建两个工程,一个制作DLL(CreateDLL),另一个使用DLL的导出函数(UseDLL)。
例如:CreateDLL中声明且定义了一个导出函数
此工程成功build后会生成 CreateDLL.dll 和 CreateDLL.lib 两个文件,其中CreateDLL.dll就是我们所需要的.dll文件,至于.lib文件有什么作用,继续往下看。
在UseDLL.cpp中,主函数代码如下:
编译UseDLL.cpp后,系统提示"unresolved external symbol "void __cdecl letterList(void)"错误,原因是未解
析的外部符号letterList()。为什么会无解析呢?我们已经包含了 CreateDLL.h 头文件了。好吧,我们假设编
译通过生成了想要的UseDLL.exe文件,那么运行该程序并与动态链接库CreateDLL.dll进行交互,程序如何
找到.dll文件中的 letterList() 函数呢?所以之前的编译错误可以理解为没有给链接器提供详细的函数地址信
息,函数的详细地址信息在哪里呢?就在与CreateDLL.dll同时生成的CreateDLL.lib文件中,该.lib文件称为
导入库(import library),链接器linker将其静态链接进.exe文件中,那么.exe在运行时就能根据.lib信息在.dll
中精确定位letterList()函数。综上可知,UseDLL.cpp文件在编译的时候需要额外的库依赖,即Additional
dependencies,在代码里如何反应呢?首先我们将CreateDLL.lib和CreateDLL.dll文件放入UseDLL工程目
录下,然后更新代码:
若要发布程序,须将exe和dll打包发布。
l 显示地导出(explicitly):当有特殊需求的时候采用此种方法,此种方法需要调用三个系统函数:
更多情况请参考微软官方说明: