c++ - 我如何(以编程方式)确保 dll 包含所有导出函数的定义?

标签 c++

假设我有这个库

//// testlib.h
#pragma once
#include <iostream>

void __declspec(dllexport) test();
int __declspec(dllexport) a();
如果我省略 a() 的定义和 test()从我的 teSTLib.cpp 中,库仍然可以编译,因为 接口(interface) [1] 仍然有效。 (如果我从客户端应用程序中使用它们,那么它们显然不会链接)
有没有一种方法可以确保在创建 obj 时(我认为这是编译器的工作),它实际上会查找我明确导出的函数的定义,如果没有则失败?
这与任何现实世界的问题无关。只是好奇。

[1] MSVC docs

最佳答案

不,这是不可能的。
部分原因是 dllexport声明在法律上甚至可能不在同一个 DLL 中实现,更不用说库了,而仅仅是对另一个 DLL 提供的东西的前向声明。
尤其是不可能在对象级别上做出决定。这只是另一个前向声明,就像任何其他声明一样。
链接 DLL 后,您可以转储导出的符号,但没有用于检查完整性的通用工具。
最终,您不能没有尝试加载所有导出接口(interface)的客户端测试应用程序。你还不能在编译时检查。即使只是成功链接测试应用程序还不够,您必须实际运行它。
如果有延迟加载的 DLL(是的,通常有),情况会变得更糟,因为现在您甚至无法检查完整性,除非您实际上从每个相关的 DLL 中调用至少一个符号。
正是出于这个原因,存在 Dependency Walker 等工具。

关于c++ - 我如何(以编程方式)确保 dll 包含所有导出函数的定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63307132/

相关文章:

C++ - SDL/OpenGL 加载图像的颜色被反转

c++ - 如何让 MATLAB 的 system() 或 dos() 实时显示控制台输出?

c++ - 按值返回堆栈上的变量是否针对移动进行了优化?

c++ - 从数组(指针)中分配一个 vector

c++ - 在构造函数中被删除后继续执行

c++ - 为什么智能指针 vector 不是指向实现与该接口(interface)协变的接口(interface)的项目?

c++ - 我们可以用 C++ 开关写这个吗?

c++ - 带有枚举的结构在 C 和 C++ 中是不同的,为什么?

c++ - fun(...) 和 (*fun)(...) 在 C/C++ 中使用函数指针有什么区别

带变量的 C++ 幂函数