【发布时间】:2016-03-14 01:59:17
【问题描述】:
假设我有两个翻译单元,都使用std::string。我用-O3 编译其中一个,另一个没有优化,然后将结果链接在一起。两个目标文件都将包含实例化的std::string,但我希望一个版本可以通过优化编译,而另一个则没有。链接器会在链接期间只选择其中一个吗?如果有,是哪一个?生成的可执行文件能否保证始终正常运行?
更新:由于这看起来是特定于实现的,因此将其范围缩小到 gcc 和 clang 行为是有意义的,因为它们都实现了定义明确且具体的 Itanium ABI,而不是试图从C++ 标准本身的视图。
【问题讨论】:
-
Both object files would contain instantiated std::string.它们将仅包含string的内联成员函数。其余的都带有libstdc++。在这种情况下,与任何其他内联函数的行为相同,链接器将选择一个,可能是您传递给链接器的第一个目标文件中的那个。我假设如果唯一改变的是优化级别(而不是某些预处理器定义),那么你应该没问题。
标签: c++ templates gcc linker template-instantiation