我知道dll可以在可执行文件加载或运行时加载(使用LoadLibrary api调用)。
对于加载时加载,我似乎只需要dll文件:不需要.a,.lib或.def文件。我想知道这些文件格式代表什么,他们的目的是什么。
我所知道的一些具体问题:
> .a是Unix上通常用于静态库的扩展。 .a文件使用GNU ld的–out-implib选项生成。据说是一个“进口图书馆”,足够公平。那么问题是“如果在链接时不需要它,那么进口图书馆有什么好处?”
> .lib是Windows上用于静态库的扩展,根据wikipedia,Windows也可以使用“import library”,所以我强烈怀疑他们只是binutils调用了.a文件的另一个名字。真假 ?
>所有页面我可以找到.def文件列出dll的导出符号。是不是有点类似于“进口图书馆”应该做什么?
>另外,我读了here,使用.def文件是在源文件(我做的)中手动指定导出的替代方法。但是我也记得读取(找不到参考).def文件提供一个索引(ordinal)到导出的符号中,允许更快的运行时加载。是这样吗 ?
--out-implib
中所述。
导入库(带有MSVC或.dll.a的.lib与GCC)是静态库:它们包含加载DLL的代码。 I had the same question the other day.
DLL可能具有导出的函数和未导出的函数。导入库必须知道哪些功能被导出,哪些不是。告诉它的一个方法是DEF文件。
When building the DLL,the linker uses
the .def file to create an export
(.exp) file and an import library
(.lib) file. The linker then uses the
export file to build the DLL file.
Executables that implicitly link to
the DLL link to the import library
when they are built.
— 07002
另请参阅MSDN: Exporting Functions from a DLL by Ordinal Rather Than by Name,一起应该回答你最后一个按索引出口的问题或序号。