2011-11-18 100 views
2

我正在写一个库函数,我真的需要能够传递参数,如vectors & maps如何将Qt容器作为参数传递给共享库的函数?

我知道你不能有在图书馆

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

因为二进制兼容性问题的头部声明STL参数的函数,除非库和可执行用相同的编译器&设置编译。

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

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

即使他们提供的DLL文件可能被不同的编译器比我的编译。

什么技术确实的Qt他们QMapQValueListQString,为了克服这种兼容性问题用?

我已经读了他们的代码了一下,但我无法隔离这个技术。

问题1:有人可以向我解释一下如何编写应用他们技术的代码吗?

我知道的唯一技术,其工作原理是提供string/map作为不透明指针,或使用平普尔成语。

问题2:我可以使用STLPort而不是'原生'STL头来实现这种调用吗?这如何影响STL的性能?

+1

你确定你的代码实际上是指预编译的二进制文件吗?通常,每次使用模板代码时都会重新编译。 (你不能“编译”模板。) –

+1

即使使用“qt技术”,当编译不同的编译器/设置时,也可以轻松地遇到问题。它只是在几次你可以替换共享库而不需要重新编译使用它的程序的情况下保存你的文件 – PlasmaHH

回答

0

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

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

+0

然后,当我导出像'std :: map FixMap(const std :: map &);'从我的库?我指的是'从共享库调用函数与STL参数' –

+0

@GrimFandango除非您提供给我们一个错误,否则不能说明 –

+0

第一个示例已在** Sutter **和** Alexandrescu **书** C++编码标准**的第63项中的详细信息。 –

相关问题