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
相关产品推荐
相关产品推荐

