You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让ld输出解修饰后的函数名?解决C++链接错误排查困扰

让ld输出解修饰后的C++函数名

太懂这种被一串乱码似的修饰函数名搞崩溃的感觉了!那些长到离谱的字符串完全看不出对应哪个函数,不过有几个简单的办法能让ld直接输出你看得懂的原始函数名:

  • 链接时直接让ld自动解修饰:
    如果你用的是GNU ld(绝大多数Linux环境默认的链接器),只需要在链接命令里加上解修饰参数就行。比如原本的链接命令是:

    g++ -o my_app my_app.o
    

    改成下面这样,让g++把参数传递给链接器:

    g++ -o my_app my_app.o -Wl,-demangle
    

    这样ld输出的错误信息里,就会直接显示未定义引用的原始函数名,不用再对着乱码瞎猜了。

  • 拿到修饰名后手动解码:
    要是你已经拿到了那串修饰后的函数名,也可以用c++filt工具反向解析。比如把你示例里的那串名字输进去:

    c++filt _ZNK5boost7archive6detail11oserializerINS0_13text_oarchiveEN9galandria8UniverseEE16save_object_dataERNS1_14basic_oarchiveEPKv
    

    它会立刻输出对应的原始函数:boost::archive::detail::oserializer<boost::archive::text_oarchive, galandria::Universe>::save_object_data(boost::archive::detail::basic_oarchive const&, void const*) const

  • 固定配置避免重复操作:
    要是不想每次链接都手动加参数,可以把-demangle加到你的Makefile链接规则里,或者配置到编译器的默认参数中,以后就一劳永逸了。

另外提一句:如果用的是Clang的ld.lld链接器,同样支持-demangle参数,用法和GNU ld完全一致,不用怕换编译器就失效。

内容的提问来源于stack exchange,提问作者Javier Vilarroig

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 08:52:38