在链接/运行时不同版本的GCC的风险?(Risks of different GCC version

2019-07-23 01:49发布

我使用的是英特尔C ++编译器,它在Linux上依赖于GNU提供的libc.so和libstdc ++。所以。

这里是我的问题。 要访问一些最新的C ++ 11层的功能,我需要使用的libstdc ++附带的GCC 4.7或更高版本。 但我使用CentOS的6.4卡住。

在CentOS 6.4,GCC的原生版本是4.4。 但是,使用所谓的“SCL”一个RedHat的东西,一个名叫包“devtoolset-1.1”,我能得到GCC 4.7下的“/选择”安装。

余设置的东西,在上面提到的方式来使用GCC 4.7,我可以使用较新的C ++ 11层的功能。

因此,这里是我的问题:如果一个用户运行我的程序,只有的GCC 4.4版本的libc.so /的libstdc ++所以在库的路径,是有我的程序将因错误的4.4和4.7版本之间有一些不匹配的风险。这些库?

如果有一个潜在的问题,我可以解决它通过静态链接在GCC 4.7的的libc和libstdc版本++? 或者是说我自己设定了其他问题,如果/当我的代码动态加载拿起其他库年长的libc /的libstdc ++通过全系统的GCC 4.4包中提供?

Answer 1:

作为禁卫军在下面的评论中指出,使用devtoolset实际上解决了我在这个答案最初描述的问题。 我已经纠正了答案。

有没有风险,我的程序有错误,由于4.4和4.7版本的库之间的一些不匹配?

是。 链接到的新的libstdc ++。因此,然后试图对运行和老年人是一个不支持100%。 如果在程序或使用的所有库中的任何对象编译GCC 4.7,并在运行时从4.7(或更新版本) 链接到的libstdc ++。所以从4.7,那么你需要使用的libstdc ++。所以。 它甚至可能不会运行,但如果它确实有可能是沉默的错误,由于不兼容。 但是,这不是你的情况的一个问题,因为你不链接到GCC 4.7的的libstdc ++。那么,请看下文。

我可以解决它通过静态链接在GCC 4.7的的libc和libstdc版本++?

1)您只需要做那的libstdc ++,因为那里是“GCC 4.7版的libc中的”没有这样的事。 Glibc是从GCC一个完全独立的项目。 当您使用GCC 4.7你不使用一个不同的libc,你还在使用从CentOS的6.4系统的libc。 (顺便说一句,请注意静态链接glibc的强烈建议不要用glibc的维护者,而当静态链接的glibc的一些功能将无法正常工作。)

2)静态链接的libstdc ++会解决问题,但你并不需要,因为这是对红帽开发工具集 (devtoolset)确实为你的好意。 devtoolset的全部意义在于,它可以让你用一个新的海湾合作委员会和新的libstdc ++,但没有对新的libstdc ++库创建任何运行时的依赖。 编译后的可执行文件只需要的libstdc ++的系统版本。所以总是存在于RHEL / CentOS的,没有devtoolset甚至安装系统。 (什么devtoolset确实是包中的所有新的libstdc ++静态库的功能,称为libstdc++_nonshared.a使所有的作品在系统中的libstdc ++。所以静态链接中,一切将来自系统的libstdc不存在++ 。所以)。

所以如果你没有使用devtoolset那么另一种选择,而不是静态链接的libstdc ++将出货较新的libstdc ++。所以你的代码,并确保它是首次发现(例如通过链接引用到新的libstdc ++的RPATH你的代码。 )。 但随着devtoolset这是没有必要的。

或者是说我自己设定了其他问题,如果/当我的代码动态加载拿起其他库年长的libc /的libstdc ++通过全系统的GCC 4.4包中提供?

,将不会有这样的问题,使用devtoolset时,因为你总是使用旧的libstdc ++,所以从来就没有冲突。



文章来源: Risks of different GCC versions at link / run time?