dll几个疑问
(1) 用c编译函数,函数修饰名是在源函数前面加_前缀;也就是说,函数名若为fn,用c方式编译过后,修饰名变为_fn。但是我们
在编写dll的时候,用extern "C " __decpspec(dllexport) void fn();导出函数名是fn,并不是_fn。不知道windows系统的dll是怎么定义的,能被多种语言使用。
(2) 用模板定义文件导出符号,例如对于一个函数: void fn();在.def文件中导出fn函数。有些地方说,使用.def导出符号,虽然在dll使用的地方可以不用__declspec(dllimport),但是用这个会效率更高。请问,效率高怎么理解?
[解决办法]
不使用 __declspec(dllimport) 也能正确编译代码,但使用 __declspec(dllimport) 使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它十分清楚函数是否在 DLL 中,因此可以生成跳过间接级别的代码,而在跨 DLL 边界的函数中通常存在这些间接代码。但是,必须使用 __declspec(dllimport) 才能导入 DLL 中使用的变量。
如果有正确的 .DEF 文件 EXPORTS 节,则不需要 __declspec(dllexport)。添加 __declspec(dllexport) 是为了提供不使用 .DEF 文件从 .EXE 或 .DLL 导出函数的简单方法。
Win32 可移植可执行文件格式旨在最小化为修改导入而必须访问的页数。为此,它将所有程序的所有导入地址都放在一个称为“导入地址表”的位置。这使得加载程序在访问这些导入时可以只修改一两页。