假设我有这个库
//// 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/