我正在使用从Windows上的程序集构建一个dll。
我知道,dll可以在加载可执行文件时加载,也可以在运行时加载(使用LoadLibrary api调用)。
对于加载时加载,我似乎只需要dll文件:不需要.a、.lib或.def文件。我想知道这些文件格式代表什么,它们有什么用途。
我所知道的和一些具体的问题:
发布于 2011-06-25 20:55:25
Linux上的静态库具有.a文件扩展名。Windows上的静态库具有.lib文件扩展名。Windows上的动态库具有.dll扩展;为了链接到DLL,需要一个导入库。导入库是一个静态库。它包含加载DLL所需的代码。现在您正在使用GCC (而不是cl.exe)在Windows上编译。GCC还有另一个导入库的文件扩展名约定,它“应该被命名为*.dll.a或*.a",正如您所提到的--out-implib中所解释的那样。
导入库(带有MSVC的.lib或带有GCC的.dll.a )是静态库:它们包含加载DLL的代码。前几天我也有同样的问题。
DLL可能具有导出的函数和未导出的函数。导入库必须知道哪些函数被导出,哪些函数没有导出。告诉它的方法之一是一个DEF文件。
生成DLL时,链接器使用.def文件创建导出(.exp)文件和导入库(.lib)文件。然后,链接器使用导出文件构建DLL文件。可执行文件,这些可执行文件在生成时隐式链接到导入库的DLL链接。-- MSDN:使用DEF文件从DLL导出
还请参阅MSDN:按顺序而不是按名称从DLL导出函数,它将按索引或序号回答您关于导出的最后一个问题。
https://stackoverflow.com/questions/6422478
复制相似问题