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

MacOS下用XCode+gnu++17编译SuperCollider遇yaml-cpp符号未定义问题

编译SuperCollider时yaml-cpp相关未定义符号问题

问题场景

  • 系统:MacOS 12.5.1
  • 编译工具:XCode
  • 编译标准:-std=gnu++17
  • 编译目标:内置yaml-cpp的SuperCollider
  • 核心问题:编译过程中出现x86_64架构下的未定义符号错误

错误日志

Undefined symbols for architecture x86_64:
  "YAML::BadConversion::~BadConversion()", referenced from:
      YAML::TypedBadConversion<bool>::~TypedBadConversion() in libsclang.a(SC_LanguageConfig.o)
      YAML::TypedBadConversion<bool>::~TypedBadConversion() in libsclang.a(SC_LanguageConfig.o)
      YAML::TypedBadConversion<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::~TypedBadConversion() in libsclang.a(PyrStringPrim.o)
      YAML::TypedBadConversion<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >::~TypedBadConversion() in libsclang.a(PyrStringPrim.o)
  "YAML::detail::node_data::convert_to_map(std::__1::shared_ptr<YAML::detail::memory_holder> const&)", referenced from:
      YAML::detail::node& YAML::detail::node_data::get<char const*>(char const* const&, std::__1::shared_ptr<YAML::detail::memory_holder>) in libsclang.a(SC_LanguageConfig.o)
  "typeinfo for YAML::BadConversion", referenced from:
      typeinfo for YAML::TypedBadConversion<bool> in libsclang.a(SC_LanguageConfig.o)
      typeinfo for YAML::TypedBadConversion<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > in libsclang.a(PyrStringPrim.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

** BUILD FAILED **

符号信息检查(SuperCollider编译产物)

% nm ../lang/SuperCollider.build/RelWithDebInfo/libsclang.build/Objects-normal/x86_64/SC_LanguageConfig.o | grep Conversion

                 U __ZN4YAML13BadConversionD2Ev
0000000000004620 T __ZN4YAML18TypedBadConversionIbED0Ev
0000000000004610 T __ZN4YAML18TypedBadConversionIbED1Ev
                 U __ZTIN4YAML13BadConversionE
0000000000006658 S __ZTIN4YAML18TypedBadConversionIbEE
0000000000006e0e S __ZTSN4YAML18TypedBadConversionIbEE
0000000000006670 S __ZTVN4YAML18TypedBadConversionIbEE

对比测试结果

  • 使用Macports提供的系统yaml-cpp编译SuperCollider,可正常完成编译
  • 单独以-std=gnu++11标准编译官方yaml-cpp项目,编译成功,其符号信息如下:
% nm ./RelWithDebInfo/libyaml-cpp.0.7.0.dylib | grep Conversion        
00000000000117e0 T __ZN4YAML13BadConversionD0Ev
00000000000117b0 T __ZN4YAML13BadConversionD1Ev
0000000000011780 T __ZN4YAML13BadConversionD2Ev
00000000000308f8 S __ZTIN4YAML13BadConversionE
000000000002ea19 S __ZTSN4YAML13BadConversionE
00000000000308d0 S __ZTVN4YAML13BadConversionE

代码差异对比

对比官方yaml-cpp与SuperCollider内置yaml-cpp的文件,发现后者缺少exceptions.cpp,仅包含exceptions.hpp,且头文件存在以下差异:

% diff include/yaml-cpp ~/SuperCollider/external_libraries/yaml-cpp/include/yaml-cpp/ |  grep Conversion
< class YAML_CPP_API BadConversion : public RepresentationException {
> class BadConversion : public RepresentationException {
<   BadConversion(const BadConversion&) = default;
<   ~BadConversion() YAML_CPP_NOEXCEPT override;

疑问

请问这是否是使用-std=gnu++17编译yaml-cpp时存在的问题?或是SuperCollider引用了错误版本的yaml-cpp导致?

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:54:52