autotools - 在 Autoconf 测试中编译多个源文件

标签 autotools autoconf static-order-fiasco

我正在对 GCC init_priority 和 MSC init_seg 进行测试。我想制作一个测试以按特定顺序编译和链接两个源文件。

我无法找到有关使用 AC_COMPILE_IFELSEAC_LINK_IFELSE 编译和链接两个源文件的信息。 Autoconf 文档似乎没有讨论用例。搜索诸如 “Autoconf test with two source files” 之类的术语会返回不相关的结果。我想我可能错过了好的搜索词。

是否可以在 Autoconf 测试期间使用两个源文件?如果是这样,那我该怎么做?

最佳答案

AC_COMPILE_IFELSEAC_LINK_IFELSE 不符合您描述的目的,它们也不打算这样做。每个都获取一个源,执行测试,然后自行清理。我什至没有在 the Autoconf archive 找到您想要的宏。 ,它提供了一些有时有用的宏,这些宏不随 Autoconf 本身一起提供。你打算做的事情很不寻常,所以如果你想继续,那么我认为你需要自己动手。引用 AC_COMPILE_IFELSEAC_LINK_IFELSE 的实现可能会有所帮助。

但是请先坐下来考虑一下,因为我认为这样的测试无论如何都没有意义。在不使用 init_priorityinit_seg 等扩展的情况下,C++ 跨翻译单元的相对初始化顺序是完全未指定的。该语言没有提供任何理由来证明它与对象在链接器命令行上出现的顺序有任何关系,甚至也没有证明不同 TU 产生的初始化不会混合的假设。因此,即使跨 TU 初始化的测试碰巧通过了,也不会传达任何可操作的信息,因为没有任何基础可以确定您尝试测试的任何特征是否对成功负责。

我考虑过建议仅通过 init_priority 对 TU 内初始化重新排序进行测试,您可以使用 AC_RUN_IFELSE 执行该测试。但是,这对您也没有用,因为您显然需要支持 MSVC++,它不提供以该粒度调整初始化顺序的机制。

最后,我认为您能做的最好的事情就是测试 init_priorityinit_seg 是否完全被编译器接受(您可以使用 AC_COMPILE_IFELSE) 来完成,并假设如果是这样,它实际上完成了它应该完成的工作。

关于autotools - 在 Autoconf 测试中编译多个源文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51662985/

相关文章:

autotools - 如何在 make 时将 shell 脚本输出放入 Makefile.am 中?

makefile - 如何链接到 autotools 项目中刚刚构建的库

python - 在 python 中访问 autoconf 定义的符号

ios - 交叉编译为静态库 (libgcrypt) 以便在 iOS 上使用

c++ - Automake 用于所有子目录中的共享库

c++ - 如何在 configure.in 中测试 C++ 库的可用性?

macos - 如果 "autoreconf -i"在 ./configure 之前运行,则库无法构建

c++ - 显式实例化模板的静态成员和另一个静态变量的初始化顺序

java - Java 有静态顺序初始化失败吗?

c++ - 内联初始化静态常量类成员的初始化顺序保证