请教各位 centos 7.9 通过 devtoolset 启用 c++14/17 时遇到的链接问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Noicdi
V2EX    C++

请教各位 centos 7.9 通过 devtoolset 启用 c++14/17 时遇到的链接问题

  •  
  •   Noicdi 3 天前 412 次点击

    这是一个 Linux c++ 程序,编译和部署均在 centOS 7.9/gcc 4.8.5 的环境上。这个程序需要对接多种证券交易柜台提供的交易 sdk (头文件和动态库),这些动态库大多是 gcc 4.8.5 编译出来的。根据 cmake 配置,程序在编译期决定最终链接哪种交易 sdk 的动态库,完成编译链接。也就是说,虽然要适配多种 sdk ,但际上运行期只加载了某一家的动态库。

    基于 gcc 4.8.5 ,只能使用 c++11 ,如果想使用 c++14/17 ,那么可能需要考虑在高版本发行版中编译程序,同时打包对应的 gcc 相关的动态库。我的理解是二进制程序所需的动态库依赖的 glibc 可能与 centos 7.9 提供的不符。那么这个场景下,可以考虑 rhel/centos 提供的 devtoolset ,他们使用的是当前发行版提供的 glibc 。

    devtoolset 9/10/11 提供了高版本的 gcc ,支持了 c++11/14/17 ,使用的也是发行版对应的 glibc 。但是 libstdc++.so 呢?在询问 ai 时,提到的方案就是说把 devtoolset 提供的 libstdc++.so 和二进制程序打包部署,设置 library rpath 来加载。我考虑说,如果我使用的是 devtoolset 中提供的 libstdc++.so ,那么程序在运行时加载的就是这个版本的,又会与交易 sdk 的动态库所需的版本不符,可能会产生问题。ai 也说是这么个理儿。我就放弃了使用 c++14/17 的念头。

    但是我今天想起这个事情,又想折腾一下,我发现 ai 提到 devtoolset-9 的 libstdc++.so.6 在 /opt/rh/devtoolset-9/root/usr/lib64,我在这个目录下面根本没翻到 libstdc++.so.6 ,而是翻到了 /opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++.so,这玩意儿不是动态库,而是个 ASCII text ,内容如下:

    /* GNU ld script Use the shared library, but some functions are only in the static library, so try that secondarily. */ OUTPUT_FORMAT(elf64-x86-64) INPUT ( /usr/lib64/libstdc++.so.6 -lstdc++_nonshared ) 

    也就是说,实际上 devtoolset 并不提供 libstdc++.so ,而是使用的发行版默认的;同时通过 /opt/rh/devtoolset-9/root/usr/lib/gcc/x86_64-redhat-linux/9/libstdc++_nonshared.a 来补充高版本 c++ 标准库所需的实现?

    那我是不是可以通过 devtoolset 来使用 c++14/17 ,同时链接 centos 7.9 提供的 libstdc++.so.6 给二进制程序和交易 sdk 动态库使用,不需要担心冲突问题,顶多在用个 GLIBCXX_USE_CXX11_ABI 来处理问题?

    4 条回复    2026-04-01 16:03:52 +08:00
    Noicdi
        1
    Noicdi  
    OP
       3 天前
    我只找到了 devtoolset 的使用,没找到啥文档来说明这玩意儿的工作原理是啥,所以不知道这么搞会不会有啥问题
    whenov
        2
    whenov  
       3 天前   1
    你关于 libstdc++.so 的猜想应该是对的,但网上的资料很少,我只找到这个评论 https://stackoverflow.com/questions/50712896/devtoolset-6-is-using-system-libstdc-and-cant-link#comment88490376_50712896
    elechi
        3
    elechi  
       3 天前
    这个测试一下就知道了
    Noicdi
        4
    Noicdi  
    OP
       3 天前
    @whenov #2 从这里的只言片语、我对 devtoolset 的观察、观察结果提交给 ai 纠错,运行逻辑似乎就是依赖本地动态库+静态库补充缺失符号。那感觉可能可以这么玩。

    另外提一嘴,我发现我的情况(第三方库依赖本地 libstdc++)比帖子里的情况(第三方库依赖高版本 libstdc++),好处理很多
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2533 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 10:08 PVG 18:08 LAX 03:08 JFK 06:08
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86