STL可以完全内联吗?

Can STL be made completely inline?

我们在 Visual Studio 2013 C++ 项目中使用第三方库。我猜这个库使用的是与我们不同的 STL 库。我们遇到了一些 link 错误。没有编译时错误。据我了解,STL 主要是基于模板的代码,因此不需要 linking。看起来 STL 的某些部分确实需要 link 使用 STL 库。想知道是否有办法强制 STL 完全内联。问候。

这个问题没有单一的答案。通常,众所周知,C++ 在不同版本的编译器(或不同品牌的编译器等)之间不是 "link-compatible"(或 "binary compatible")。因此,提供库的人应该准确指定他们希望使用的编译器,库的用户将需要使用那个编译器。 [我什至看到使用完全相同的版本,但编译器的两个不同 "builds" 的问题]

为了可能找到解决方案,您必须查看 compiler/linker 试图找到的是什么,然后查看该函数是否完全存在于 STL 的源代码中 - 如果它是,然后可能应用 "always_inline" 的自由洒布(在相关功能上)或特定编译器用于该功能的任何东西。但是很可能您缺少的函数最初并没有在头文件中提供。这当然假设您确实拥有库的源代码,以便可以重新编译它 [或者您可以说服提供者使用新设置重新编译]。

而且您可能仍然会遇到依赖于实现的问题(我上面提到的 "same version, different build" 的问题是编写 STL 实现的人决定从 "unsigned int" 更改构造函数参数到 "size_t" 在某些时候,这 [可能会改变或] 改变传递给构造函数的数据的大小 -> 当你调用函数时表现不一样 [但共享库加载器检测到它并拒绝加载executable/shared 库组合]

[正如 Lightness Races in Orbit 所说,以上内容适用于 "Standard Template Library",即 std::vectorstd::mapstd::random 和许多其他内容,但它不包括编写任何重要的 C++ 程序所需的所有运行时功能]

STL is primarily template-based code

"STL" 作为术语是常用的(这本身是不准确的)relates only to a very small subset of the C++ standard library,而且很多 C++ 标准库都不是模板。而且这仍然没有考虑您的实施必须 link 到您的项目中的任何 C++ 运行时。

因此,假设您指的是 C++ 标准库或(更有可能)整个 Visual Studio 运行时……不,您不能将其全部内联

您可能应该根据自己的工具链重建第三方库。