首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态库中的libstdc++静态链接

动态库中的libstdc++静态链接
EN

Stack Overflow用户
提问于 2017-06-27 14:58:37
回答 2查看 3.5K关注 0票数 4

要理解问题,我应该告诉您更多关于加载动态库的程序。它是半衰期专用服务器。它使用位于可执行文件旁边的旧libstdc++。为了避免出现问题,在使用新标准库的特性时,我通常会将我的项目状态链接到libstdc++。

我的朋友告诉我,如果加载了使用不同编译器库编译的2种编译器,或者当我从服务器调用函数(这是在内部用旧的libstdc++实现的)时,libstdc​++静态链接可能会产生问题。

是真的吗?我怎样才能解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-28 17:46:31

共享库公开的API必须使用主机应用程序所期望的相同的ABI,即所涉及的类型必须具有相同的布局、大小和对齐方式。

如果在API中公开了std::类型,或者它引发C++异常,那么这意味着必须使用定义的标准库头和宏来编译共享库。在这种情况下,您可以动态链接到主机应用程序附带的libstdc++

如果API中没有公开的std::类型,并且没有从共享库引发异常,则可以静态地链接到libstdc++。但是,所有外部符号仍将从共享库中公开,因此当没有dlopen标志的调用加载它时,如果它们可用,它将使用来自主机应用程序的相同名称的符号,而不是您希望静态链接的符号,这可能会导致您的朋友可能引用的未定义行为。为了避免这种情况,需要一个链接器版本脚本来使共享库中的所有符号都是本地的,并且只将API符号公开为全局的。类似于:

代码语言:javascript
复制
MYHALFLIFEPLUGIN_0.0 {
  global: half_life_foo,half_life_bar; # Explicitly list symbols to be exported.
  local: *; # Hide everything else.
};

并指示链接器与-Wl,--version-script=<filename>编译器链接器选项(LDFLAGS)一起使用此脚本。除了-static-libstdc++选项之外,您还需要-static-libgcc链接器选项。

同时,通读一遍

了解更多详细信息。

票数 4
EN

Stack Overflow用户

发布于 2017-06-27 15:18:32

是的是真的。最简单的示例是,如果在库中使用new创建对象,在另一个不使用相同STL的库中创建delete

你有两个解决方案:

  • STL使用动态链接
  • 确保不兼容不跨越二进制文件(库、exe)的边界。要做到这一点,很难的方法是让您的库只公开一个C(没有C++)。
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44783614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档