我不明白将 .def 文件与 DLL 一起使用的意义。
它似乎取代了在您的 DLL 代码中使用显式导出的需要(即显式 __declspec(dllexport))但是当我不使用这些时我无法生成一个 lib 文件,然后在使用 DLL 时创建链接器问题.
那么在与客户端应用程序链接时如何使用 .defs,它们是否取代了使用头文件或 .lib 文件的需要?
最佳答案
我发现同时使用 __declspec(dllexport) 和 .def 文件有助于创建可移植的 DLL,即可以从使用不同编译器或不同编译器设置编译的代码调用的 DLL。
只需将 __declspec(dllexport) 放在您的函数声明中,就会导致这些函数被您的 DLL(至少在 Windows 上)“导出”,以便可以从 DLL 外部调用它们。
但是,将列出所有导出函数的 .def 文件添加到构建中可以让您阻止 Microsoft 编译器(例如)将前导下划线和尾随参数宽度信息添加到导出函数名称(至少在组合时)使用 __stdcall 指令,对于可移植性也很有用)。例如。函数声明
void foo(int i);
如果您不注意调用约定和 .def 文件的使用,最终可能会导出为“_foo@4”。
在将 GetProcAddress() 调用作为在运行时显式加载和 Hook 到 DLL 的一部分时,保持符号表中导出的函数名称不受此类名称修饰非常方便。即要在运行时获取指向上述函数 foo() 的指针(假设它已被导出),理想情况下您只想调用:
HANDLE dllHandle = LoadLibrary("mydll.dll");
void* fooFcnPtr = GetProcAddress(dllHandle, "foo");
当然还有一些适当的错误案例检查!
在构建 DLL 时,在函数声明中使用 .def 文件以及 __stdcall、__declspec(dllexport) 和 extern "C"将确保上述客户端代码适用于各种编译器和编译器设置。
关于c++ - .def 文件 C/C++ DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/366228/