STL可以完全内联吗?

时间:2015-06-19 20:03:33

标签: c++ stl

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

2 个答案:

答案 0 :(得分:3)

这个问题没有一个答案。一般来说,众所周知,C ++与链接兼容" (或"二进制兼容")不同版本的编译器(或不同品牌的编译器等)之间。因此,提供库的人应该准确指定他们期望使用哪个编译器,并且库的用户将需要使用该编译器。 [我甚至看到使用完全相同版本的问题,但两个不同的"构建"编译器]

为了找到解决方案,您必须查看编译器/链接器尝试查找的内容,然后查看该函数是否存在于STL的源中 - 如果是,然后可能应用自由洒水(在相关的功能上)" always_inline"或者特定编译器用于该功能的任何内容。但可能的是,首先没有在头文件中提供您缺少的功能。这当然假设您实际拥有库的源,以便可以重新编译[或者您可以说服提供程序使用新设置重新编译]。

你可能仍然会遇到依赖于实现的问题(问题与#34;相同的版本,不同的版本和#34;我上面提到的是编写STL实现的人决定更改构造函数参数来自" unsigned int"到" size_t"在某些时候,[可能会改变或]改变传递给构造函数的数据的大小 - >当你调用时表现不一样函数[但共享库加载器检测到它并拒绝加载可执行文件/共享库组合]

[正如Orbit中的Lightness Races所说,以上内容适用于"标准模板库",其中包括std::vectorstd::mapstd::random等许多内容其他的东西,但它不包括编写任何非平凡的C ++程序所需的所有运行时功能]

答案 1 :(得分:2)

  

STL主要是基于模板的代码

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

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

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