【问题标题】:C++ linking error after upgrading to Mac OS X 10.9 / Xcode 5.0.1升级到 Mac OS X 10.9 / Xcode 5.0.1 后出现 C++ 链接错误
【发布时间】:2013-11-07 08:45:44
【问题描述】:

升级到 Mac OS X 10.9 / Xcode 5.0.1 后,创建共享库 (.dylib) 的命令行失败,出现多个未定义符号。

clang++ -dynamiclib -install_name test.dylib *.o -o test.dylib
Undefined symbols for architecture x86_64:
  "std::allocator<char>::allocator()", referenced from:
      _main in test.o
  "std::allocator<char>::~allocator()", referenced from:
      _main in test.o
  "std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from:
      _main in test.o
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
      _main in test.o
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
      _main in test.o
  "std::ios_base::Init::Init()", referenced from:
      ___cxx_global_var_init in test.o
  "std::ios_base::Init::~Init()", referenced from:
      ___cxx_global_var_init in test.o
  "std::cout", referenced from:
      _main in test.o
  "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
      _main in test.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<<<char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
      _main in test.o
ld: symbol(s) not found for architecture x86_64

【问题讨论】:

    标签: c++ linker clang++ osx-mavericks


    【解决方案1】:

    答案就在那里:https://mathematica.stackexchange.com/questions/34692/mathlink-linking-error-after-os-x-10-9-mavericks-upgrade

    在 OS X 上有两种可用的标准 C++ 库实现:libstdc++ 和 libc++。它们不是二进制兼容的,libMLi3 需要 libstdc++。

    在 10.8 和更早版本上默认选择 libstdc++,在 10.9 上默认选择 libc++。为了保证与 libMLi3 的兼容性,我们需要手动选择 libstdc++。

    为此,请将 -stdlib=libstdc++ 添加到链接命令中。

    相关帖子:Compiling with Clang using Libc++ undefined references


    编辑:经过一些调查,-mmacosx-version-min 和默认libstd 的选择之间似乎存在联系。如果最低版本 libstd 等于 libstdc++,否则为 libc++。长期的解决方案显然是使用-stdlib=libc++

    【讨论】:

    • 您知道如何将“-stdlib=libc++”永久设为默认值吗?
    • 请问,您是否得到了如何“将 -stdlib=libstdc++ 添加到链接命令”的答案? @Ajay
    • 这是您的构建工具的设置。
    • 什么是链接命令?我有一个makefile并且有这个问题,但不知道放在哪里 -stdlib=libstdc++
    • 在您的 Makefile 中,应该有一个“链接器规则”来从中间源 (*.o) 创建二进制可执行文件。如果你的 Makefile 是标准的,那么你应该把它引入到 LDFLAGS 变量中。
    【解决方案2】:

    这些建议对我来说不适用于 Mac El capitan。如果您在升级到 El Capitan 后遇到类似问题,只需运行

    xcode-select --install
    

    在尝试编译之前

    【讨论】:

    • 这对我不起作用。你能帮我理解这样做的目的是什么吗?如果我知道这应该改变/解决什么,也许我可以找出为什么它对我不起作用。
    猜你喜欢
    • 2013-11-07
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    相关资源
    最近更新 更多