【发布时间】:2022-01-13 06:58:46
【问题描述】:
动机: 一些图书馆,例如Eigen 有ABI that depends on compiler switches。
问题: 这个库的用户能否以某种方式对这种行为进行编码,以便如果您尝试链接使用不同编译器开关编译的组件,则会出现链接器错误。
所以如果不清楚我为什么要问:
库开发人员 Alice 构建她的(不是仅标头库)没有特殊的编译器标志,并在她的 API 中公开 Eigen。
库使用者 Bob 在启用 AVX2 的情况下进行编译,他还在他的代码中使用 Eigen。他使用 Alice 库。
Bob 在运行时崩溃。
Alice 可以阻止她的库链接到 Bob 的应用程序吗?假设 Alice 知道使用影响 Eigen ABI 的预处理器宏来检测 ABI 不匹配。
注意:如果在编译器中实现,我可以使用 C++20 或 C++23 解决方案。
【问题讨论】:
-
Bob 在这里负责确保他的可执行文件与他正在使用的库的二进制兼容性。虽然 Alice 可以在库初始化时放置一些接口检查代码,但它不能 100% 防错。
-
如果
alice.lib有一个初始化函数,我可以想象通过使用基于宏的模板定义和特化来强制链接错误。 -
不,我没有。但它与@user7860670 显示的问题中的建议基本相似。两者的想法是相同的,如果宏更改,则强制链接失败,因为声明丢失或不匹配。
-
如果用户对库什么都不做,则不存在 ABI 问题:P 并且链接错误也只发生在那些使用的部分。因此,如果您没有保证进入库的入口点,则需要将该 hack 包含到用户使用的所有内容中。然而,这也可以使用一个静态变量来完成,该变量保证会被初始化以执行此检查。