【问题标题】:Default to lib=stdlibc++ for clang++ on Mac OS Mavericks with Xcode?使用 Xcode 在 Mac OS Mavericks 上默认为 lib=stdlibc++ 的 clang++?
【发布时间】:2014-05-28 17:37:26
【问题描述】:

我正在使用 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++ 的默认值,无论是配置设置还是环境变量?另外,仅供参考,为什么我会收到错误消息?

【问题讨论】:

  • 这只是一个简单的 C++ 程序来打印“Hello, World”。如果您愿意,我可以发布源代码,但请注意,如果我指定 stdlibc++,它会起作用。它包含的唯一库是

标签: c++ macos clang++


【解决方案1】:

MACOSX_DEPLOYMENT_TARGET 可能就是您要找的。​​p>

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

【讨论】:

  • 在我的系统上导致了这个错误:CMake Error at /usr/local/Cellar/cmake/3.2.3/share/cmake/Modules/Platform/Darwin.cmake:76 (message): CMAKE_OSX_DEPLOYMENT_TARGET is '10.8' but CMAKE_OSX_SYSROOT: "" is not set to a MacOSX SDK with a recognized version. Either set CMAKE_OSX_SYSROOT to a valid SDK or set CMAKE_OSX_DEPLOYMENT_TARGET to empty. Call Stack (most recent call first): /usr/local/Cellar/cmake/3.2.3/share/cmake/Modules/CMakeSystemSpecificInformation.cmake:36 (include) CMakeLists.txt:12 (project)
  • @kilojoules:应该自我解释。 export CMAKE_OSX_SYSROOT=$(xcrun --show-sdk-path).
  • xcrun --show-sdk-path 什么也不返回。运行两个导出命令后,我收到相同的错误消息。有什么我应该下载的吗?
  • @kilojoules: xcrun 是一个 Xcode 实用程序。 export CMAKE_OSX_SYSROOT=/ 也可以。
  • 好的,感谢您的帮助。我安装了 XCode,xcrun --show-sdk-path 现在可以使用了。当我使用这些设置运行我的 cmake 文件时,仍然找不到 10.8 目标。现在我收到这条消息:``` CMAKE_OSX_DEPLOYMENT_TARGET 是 '10.8' 但匹配的 SDK 不存在于:“/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk " 而是使用 SDK:"/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk"。 ```
【解决方案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++");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-27
    • 2015-02-03
    • 2016-10-25
    • 2014-02-09
    • 2014-07-17
    • 2013-10-21
    • 2014-05-06
    相关资源
    最近更新 更多