升级到Mac OS X 10.9 / Xcode 5.0.1后的C++链接错误

26
升级到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
2个回答

36
答案在这里: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++ 添加到链接命令中。
相关帖子:使用Libc++编译Clang出现未定义引用 编辑:经过一些调查,似乎 -mmacosx-version-min 与默认的 libstd 选择之间存在联系。如果 min 版本小于 10.9,则默认的 libstd 等于 libstdc++,否则等于 libc++。长期解决方案显然是使用 -stdlib=libc++

1
你知道如何永久地将“-stdlib=libc++”设置为默认值吗? - Ajay
1
不好意思,你有关于如何“将-stdlib=libstdc++添加到链接命令”的答案吗?@Ajay - Calios
这是您的构建工具设置。 - FabienRohrer
1
什么是链接命令?我有一个makefile并且遇到了这个问题,但不知道在哪里加上-stdlib=libstdc++。 - rjurney
1
在您的Makefile中,应该有一个“链接规则”,从中间源(*.o)创建二进制可执行文件。如果您的Makefile是标准的,那么您应该将其引入LDFLAGS变量中。 - FabienRohrer
如果我在golang中使用cgo,该如何操作? - andy

0

这些建议在我的Mac El Capitan上没有起作用。如果您在升级到El Capitan后遇到类似的问题,只需运行以下命令:

xcode-select --install

在尝试编译之前


2
这对我没用。你能帮我理解这的目的是什么吗?如果我知道这应该改变/解决什么问题,也许我就能找出为什么它对我不起作用了。 - sitting-duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接