如何在CentOS 6上部署C11程序(依赖关系),其CCC是C 03?

只要您使用相同的C标准,GCC就具有ABI兼容性[ 1].

但是它告诉我,如果在C 03模式下由GCC 4.3编译的共享库暴露了一个std :: string,那么这将是一个与GCC 4.8在C中编译的可执行文件所理解的不同的std :: string 11模式.

我问的原因是,我计划在CentOS 6上以C11模式部署GCC 4.8编译的程序,CentOS 6的最大封装GCC是4.3 …和一些共享库(无论是第三方C库还是更多的)系统级的东西)可能因此都是C 03.但是如果是这样,我们就无法在旧的Linux发行版上部署任何C11程序,这似乎不大可能.

我天真认为这里可能有问题吗?而且,如果有的话,我该如何解决呢?

实际上,您可以在一个香草CentOS 6平台上分发一个使用较新g编译器编译的程序.有几种方法可以做到这一点:最简单的是使用 DevToolset 3,这将给你g 4.9.2(开发工具集2将给你gcc 4.8.2).然后,只需用这个g编译你的应用程序.分发软件时,您还需要确保运送与g 4.9一起运送的libstdc .so.设置LD_LIBRARY_PATH,以便在启动时被选中,或者将 RPATH设置为告诉您的可执行文件首先查找库.

从本质上讲,您也可以使用较新的编译器,但是您首先需要编译编译器本身.如果您不想先编译编译器,请使用相应的开发工具集,您应该很好.

是的,你也可以尝试到statically link libstdc++.a.搜索选项-static-libstdc:

When the g++ program is used to link a C++ program, it normally automatically links against libstdc++. If libstdc++ is available as a shared library, and the -static option is not used, then this links against the shared version of libstdc++. That is normally fine. However, it is sometimes useful to freeze the version of libstdc++ used by the program without going all the way to a fully static link. The -static-libstdc++ option directs the g++ driver to link libstdc++ statically, without necessarily linking other libraries statically.

但是,如果您静态链接,则不会得到任何安全更新等等.如果您自己发送libstdc .so,则不会得到更新,但增量更新可能更容易.

关于运行您的应用程序:经验法则是:在需要支持的最旧平台上进行编译,然后您的二进制文件(使用自带的libstdc和其他必需的lib)也可能在较新版本上运行.也就是说,如果您在CentoOS 6上编译,并且它可以工作,那么您可以期望它也可以在CentOS 7上运行.在相关主题上,这正是为什么例如AppImage和相关解决方案建议在旧系统上构建的原因.

相关文章
相关标签/搜索