3

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

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

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

4

1 回答 1

3

AC_COMPILE_IFELSE并且AC_LINK_IFELSE不服务于您描述的目的,并且他们不打算这样做。每个都取一个源,执行其测试,然后自行清理。我什至没有在 Autoconf 存档中找到您想要的宏,它提供了许多有时有用的宏,这些宏不随 Autoconf 本身一起提供。你提议做的事情很不寻常,所以如果你想继续,那么我认为你需要自己动手。可能有助于咨询 和 的AC_COMPILE_IFELSE实现AC_LINK_IFELSE

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

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

最终,我认为你能做的最好的事情就是测试编译器是否接受init_priority或被编译器接受你可以用它来做),并假设如果是这样,它实际上完成了它应该做的工作。init_segAC_COMPILE_IFELSE

于 2018-08-03T18:30:17.967 回答