c++ - .def 文件 C/C++ DLL

标签 c++ c dll

我不明白将 .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/

相关文章:

c - C中表达式的解析规则是什么?

c - sqrtf 函数不包含 math.h 库

c++ - 无法理解范围解析运算符的使用

c++ - 如何检测计算机是否正在关闭以保存 session

c++ - 当你定义一个空的默认构造函数时会发生什么?

windows - 如何调试regsvr32编译后DLL注册异常?

c# - 从 Java 调用 C# dll

c++ - 如何在 Travis CI 中为 C++ with/CMake 项目正确配置 CodeCov?

检查一个字符串是否是另一个字符串的子字符串

c# - Visual Studio 无法在设计模式下加载 native dll