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

时间:2018-08-02 22:31:14

标签: autotools autoconf static-order-fiasco

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

我无法找到有关使用AC_COMPILE_IFELSEAC_LINK_IFELSE编译和链接两个源文件的信息。 Autoconf文档似乎没有讨论用例。搜索诸如“使用两个源文件进行Autoconf测试” 之类的结果将返回无关的结果。我想我可能缺少好的搜索字词。

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

1 个答案:

答案 0 :(得分:3)

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 ++,而MSVC ++并没有提供以这种粒度调节初始化顺序的机制。

那么,我认为最终最好的方法是测试编译器是否完全接受init_priorityinit_seg({em> {1}},并假设如果确实如此,它实际上完成了应做的工作。