STL可以完全内联吗?
Can STL be made completely inline?
我们在Visual Studio 2013 C++项目中使用了第三方库。我猜这个库使用的 STL 库与我们的不同。我们收到一些链接错误。没有编译时错误。据我了解,STL主要是基于模板的代码,因此不需要链接。看起来 STL 的某些部分确实需要与 STL 库链接。想知道是否有办法强制 STL 完全内联。问候。
这个问题没有单一的答案。一般来说,众所周知,C++在不同版本的编译器(或不同品牌的编译器等)之间不"链接兼容"(或"二进制兼容")。因此,提供库的人应该准确指定他们希望使用的编译器,并且库的用户将需要使用该编译器。[我什至看到使用完全相同的版本,但编译器的两个不同"版本"的问题]
要找到解决方案,您必须查看编译器/链接器试图查找的内容,然后查看该函数是否存在于 STL 的源代码中 - 如果是,那么可能会应用自由洒(在相关功能上)"always_inline"或特定编译器用于该功能的任何内容。但是,您缺少的功能可能首先没有在头文件中提供。当然,这假设您实际上拥有库的源代码,以便可以重新编译它[或者您可以说服提供程序使用新设置重新编译]。
而且你可能仍然会遇到依赖于实现的东西的问题(我上面提到的"相同版本,不同的构建"的问题是,编写 STL 实现的人决定在某个时候将构造函数参数从"unsigned int"更改为"size_t",这 [可能会改变或] 更改传递给构造函数的数据的大小 ->调用函数时行为不同[但共享库加载器检测到它并且甚至拒绝加载可执行文件/共享库组合]
[正如 Lightness Races in Orbit 所说,以上适用于"标准模板库",它是像 std::vector
、std::map
、std::random
和许多其他东西的东西,但它不包括编写任何非平凡C++程序所需的所有运行时功能]
STL 主要是基于模板的代码
术语"STL"(这本身是不准确的)仅涉及C++标准库的一小部分,并且许多C++标准库不是模板。这仍然没有考虑到您的实现必须链接到项目的任何C++运行时。
所以,假设你指的是C++标准库或(更有可能)整个Visual Studio运行时......不,你不能全部内联。
您可能应该针对自己的工具链重建第三方库。
- 没有找到相关文章