STL可以完全内联吗?

Can STL be made completely inline?

本文关键字:STL      更新时间:2023-10-16

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

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

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

而且你可能仍然会遇到依赖于实现的东西的问题(我上面提到的"相同版本,不同的构建"的问题是,编写 STL 实现的人决定在某个时候将构造函数参数从"unsigned int"更改为"size_t",这 [可能会改变或] 更改传递给构造函数的数据的大小 ->调用函数时行为不同[但共享库加载器检测到它并且甚至拒绝加载可执行文件/共享库组合]

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

STL 主要是基于模板的代码

术语"STL"(这本身是不准确的)仅涉及C++标准库的一小部分,并且许多C++标准库不是模板。这仍然没有考虑到您的实现必须链接到项目的任何C++运行时。

所以,假设你指的是C++标准库或(更有可能)整个Visual Studio运行时......不,你不能全部内联

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

相关文章:
  • 没有找到相关文章