【问题标题】:Use STL internally in a static lib with different versions of visual studio在具有不同版本的 Visual Studio 的静态库中内部使用 STL
【发布时间】:2012-10-30 20:16:05
【问题描述】:

我正在尝试将我的应用程序与在不同版本的 Visual Studio 中构建的静态库链接(我使用的是 VS2010,该库是使用 VS2008 构建的)。静态库在内部使用 STL,我收到一些基本字符串方法无法找到的链接器错误。

我知道如果静态库在其公共接口中使用 STL,那么这是不可能的,因为 STL 对象是二进制不兼容的。但这种情况并非如此。我调用的库中的所有方法都没有使用 STL,并且我没有将 STL 对象传递给库。但在内部,静态库在它自己的函数中使用 STL。

看起来库中没有编译 STL 代码,链接器正在尝试将 STL 链接到内部方法。我的问题是有什么方法可以编译静态库以静态链接到 STL 并包含其中的所有代码?

我应该提到我自己的应用程序也使用 STL。但似乎这两个版本都可以编译,前提是它们永远不会相互传递。

【问题讨论】:

  • 混合版本的问题是库和类/函数名称会相同,所以只能链接一个版本。
  • @Mark Ransom:不过,这在此处不重要。当他链接他的应用程序时,他不应该对标准库的库版本有任何依赖——在链接该库时它们已经被解决了。当然,这假设在该库的公共界面中的任何地方都使用了 no std::string
  • 我纠正自己!我没有注意到他正在链接到一个 static 库。是的,那就不行了。

标签: c++ visual-studio stl


【解决方案1】:

如果您要链接到 static 库,并且该库依赖于标准 C++ 库的版本 X,那么您的应用程序需要与版本链接X,除了版本 Y,您可能会在您的应用程序中使用。

由于标准库的版本 X 和版本 Y 的多个导出符号名称将相同,因此您最终会出现链接器错误。

能否将第三方库包装在 DLL 中?这样就可以解决问题了。

【讨论】:

  • 这是有道理的。我在想如果静态库在其中链接了它的 STL 版本,那么我不必将我的应用程序与这个版本链接。但是这些符号仍然可见,因为它不是 DLL。就像我不能在静态库中拥有与函数同名的函数一样。感谢您的帮助。
  • 实际上,有一个链接器选项“Link Library Dependencies”应该包含静态库的任何依赖项。但老实说,我不确定这是否能解决最终的链接器错误,因为符号仍然会发生冲突。另见stackoverflow.com/questions/7683869/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多