首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果不公开std符号,则在旧系统上运行最近编译的.so。

问如果不公开std符号,则在旧系统上运行最近编译的.so。
EN

Stack Overflow用户
提问于 2018-07-16 10:06:41
回答 2查看 288关注 0票数 1

我的目标是使用最近的C++特性,如智能指针(至少std::shared_ptr),用于linux,所以库应该在多个发行版上运行(显然,每个平台都会重新编译)。我瞄准的最老的gcc是4.4.x因为我需要支持RHEL6。对于这样的简单程序,似乎支持智能指针。

代码语言:javascript
复制
#include <iostream>
#include <memory>

int main()
{
    std::shared_ptr<int> aa;
    return 0;
}

我的库将公开一个C++ (extern),我在API中不使用异常或C++类型。我是静态地链接libstdc++和libgcc并标记除API导出的符号以外的所有本地符号。。

我现在有另一个问题:在上述情况下,用较新的gcc (例如5.0甚至6.0)编译的库会在一个老的系统上工作,比如RHEL6,默认安装了gcc 4.4.x 可靠

理论上,使用更新的C++特性,但不公开符号或API中的任何特性都是可行的,但我不太确定,我宁愿问。

EN

回答 2

Stack Overflow用户

发布于 2018-07-16 11:36:52

是。

实际上,关于你的情况的Red发布了一篇博客文章:

依赖第三方库或插件接口的用户仍然使用旧的ABI,他们可以用-D_GLIBCXX_USE_CXX11_ABI=0构建他们的代码,一切都应该很好。在大多数情况下,由于链接器的错误()抱怨涉及__cxx11的未解决符号,需要使用此标志时非常明显。 更改C++11的计划是让soname (和现有的二进制接口)单独使用,并使用不同的损坏名称来表示新的ABI。

由于您使用libstdc++静态编译,所有应用程序都将可靠地工作,或者无法链接。当发生这种情况时,请更改编译标志以添加_GLIBCXX_USE_CXX11_ABI=0。

总之,您不应该关心API的更改,而应该只关心ABI的更改。这一次,GNU团队做对了!

票数 1
EN

Stack Overflow用户

发布于 2018-07-16 12:44:52

假设您在相同的发行版(即libc、libpthread等)上编译和运行库,那么它应该完全正常工作,唯一需要关心的是libgcc (gcc运行时库)。如果版本不同,如1.1和1.2,则可能会有不同的行为。所以,确保你在同一个版本上,即gcc-5/6没有带来任何新版本的libgcc,我没有意识到什么,我倾向于认为它在任何地方都是第1版,所以这里不用担心。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51359318

复制
相关文章

相似问题

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