【问题标题】:How can Qt containers be passed as parameters to functions of a shared library?Qt 容器如何作为参数传递给共享库的函数?
【发布时间】:2011-11-18 13:45:54
【问题描述】:

我正在编写一个库函数,我确实需要能够将 vectorsmaps 之类的参数传递给它。

我知道你不能在库的头部声明一个带有 STL 参数的函数

std::map<int> FixMap( const std::map<int> & );

由于二进制兼容性问题,除非库和可执行文件是使用相同的编译器和设置编译的。

另一方面,使用 Qt 模板库以下工作

QMap<int> FixMap( const QMap<int> & );

即使他们提供的 DLL 可能是由与我不同的编译器编译的。

Qt 使用他们的QMapQValueListQString 使用什么技术来克服这个兼容性问题?

我已经阅读了一些他们的代码,但我无法隔离该技术。

问题 1: 有人可以向我解释(或许通过简短的演练?)如何编写应用他们技术的代码?

我知道唯一可行的技术是将string/map 作为一个不透明指针,或者使用pImpl 成语。

问题 2: 我可以使用 STLPort 代替“本机”STL 标头来实现这种调用吗?这对 STL 的性能有何影响?

【问题讨论】:

  • 您确定您的代码实际上是指预编译的二进制文件吗?通常,模板代码每次使用时总是重新编译。 (您不能“编译”模板。)
  • 即使使用“qt 技术”,在使用不同的编译器/设置进行编译时也很容易遇到问题。它只是让您免于在一些情况下您可以替换共享库而无需重新编译使用它的程序

标签: c++ qt stl abi


【解决方案1】:

第一个示例与第二个示例一样好,即使该库是使用另一个编译器而不是您使用的编译器构建的。重要的是 Application Binary Interface 或简称 ABI 对于您的程序和库来说是相同的。

Qt 在构建库时不使用任何特殊的东西。

【讨论】:

  • 那么当我从库中导出像std::map&lt;int&gt; FixMap( const std::map&lt;int&gt; &amp; ); 这样的函数时,真正的问题是什么?我指的是“使用共享库中的 STL 参数调用函数”的问题
  • @GrimFandango 无法判断,除非您向我们提供错误信息。
  • 第一个例子的问题在SutterAlexandrescuC++编码标准一书的第63条中有详细描述b>.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2020-06-26
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
相关资源
最近更新 更多