【问题标题】:calling functions with STL parameters from a shared library从共享库调用带有 STL 参数的函数
【发布时间】:2011-04-12 15:23:41
【问题描述】:

我知道不可能安全地导出函数 C++ 参数(例如 STL 字符串),因为 C++ 没有指定标准 ABI。 (我已将其作为对 How to call a function from a shared library? 的回答阅读)

人们倾向于相信如果你的库和你的程序都是用同一个编译器构建的那么这不是问题,但不幸的是,对于一些 VC++ 编译器来说,这并不完全正确.

Herb Sutter 和 Alexandrescu 在“C++ 编码标准”中建议依赖可移植类型(例如内置类型)而不是采用 string 的函数。

即在模块接口中而不是使用std::string

 std::string Translate( const std::string & );

使用一个

void Translate( const char *src, char* dest, size_t destSize );

虽然他们同意这对于调用者和被调用者来说都相当复杂,但他们并没有提出更好的替代方案。

如何使用低级类型很好地传递更复杂的对象,例如std::map? (更不用说像map<string,vector<something_complex> > 这样复杂的东西了)

在导出函数时如何处理这种情况?

【问题讨论】:

    标签: c++ shared-libraries


    【解决方案1】:

    您不仅必须使用相同的编译器(或兼容的 ABI)构建程序,还需要使用相同的设置:调试和发布模式、DLL 和静态模式、检查迭代器(或不检查)以及很快。在一方面,STLPort 做得对:std::string 在为他们的库构建时根据这些设置重命名为不同的符号,完全避免了这个问题。

    另一种选择是将不透明的指针传递给在 DLL 中分配、处置和使用的对象。实际上,如果您想将它们用作 DLL 之外的对象,则为您需要的函数创建自己的虚拟接口。

    【讨论】:

    • 它们确实是使用相同的设置编译的,但程序仍然崩溃。这发生在一些旧的 (2005) 版本的 VC++ 编译器中。在 Linux 和 Unix 中运行良好。
    • @Grim,它们是否共享相同的内存分配器堆? /MD(_DLL 模式)有助于确保这一点,因为它会导致从 MSVCR70.DLL 绑定到 malloc / free / operator new / operator delete。这意味着 /MT(或 /MS)不会自动共享相同的内存分配器区域。
    • @Grim,同样有自定义的malloc / free / operator new / operator delete 任何模块中的例程吗?
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多