对于使用Xcode的Mac OS Mavericks,对于clang ++,默认为lib = stdlibc ++?

时间:2014-05-14 23:19:22

标签: c++ macos clang++

我正在使用Xcode 5.1.1运行MacOS X Mavericks,包括命令行工具。 我正在使用Xcode提供的clang ++编译简单的C ++程序,版本信息是: Apple LLVM版本5.1(clang-503.0.40)(基于LLVM 3.4svn)

我发现如果我尝试运行以下命令

  

clang ++ -o hello.out hello.cpp

我收到以下错误:

Undefined symbols for architecture x86_64:
"std::ios_base::Init::Init()", referenced from:
___cxx_global_var_init in hello-2ad0da.o
"std::ios_base::Init::~Init()", referenced from:
___cxx_global_var_init in hello-2ad0da.o
"std::cout", referenced from:
_main in hello-2ad0da.o
"std::basic_ostream<char, std::char_traits<char> >& std::operator<<<std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
_main in hello-2ad0da.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果我将命令更改为

  

clang ++ -o hello.out -stdlib = libstdc ++ hello.cpp

我没有收到任何错误。

有没有办法让“-stdlib = libstdc ++”成为clang ++的默认设置,或者使用某些配置设置或某些环境变量?另外,仅仅为了我的信息,为什么我会收到错误?

2 个答案:

答案 0 :(得分:4)

MACOSX_DEPLOYMENT_TARGET可能就是您要找的。

export MACOSX_DEPLOYMENT_TARGET=10.8应该clang默认为libstdc++而不是libc++

答案 1 :(得分:2)

在OS X 10.9.x之前

  

默认值为libstdc++(使用clang ++ -o hello.out hello.cpp)   本来可以的。

OS X 10.9.x

  

默认值为libc++(如您所知,包含标志   -stdlib = libstdc ++正确链接你的项目。

由于您尝试编译使用不在较新LLVM libc++标准库设计范围内的符号的代码,因此会收到错误。至于更改clang使用的默认值,您可能需要修改ToolChains.cpp (docs),例如:

-     DAL->AddJoinedArg(0, Opts.getOption(options::OPT_stdlib_EQ), "libc++");
+     DAL->AddJoinedArg(0, Opts.getOption(options::OPT_stdlib_EQ), "libstdc++");