【问题标题】:builds in xcode 4.6 but fails using command line在 xcode 4.6 中构建,但使用命令行失败
【发布时间】:2013-01-27 13:25:54
【问题描述】:

当我从 Xcode4.6 运行以下代码 sn-p 时,它编译并运行良好。但是当我尝试使用命令行工具(clang++)编译它时,它却失败了。

#include <iostream>
#include <memory>

int main(int argc, const char * argv[])
{

    std::unique_ptr<int> foo(new int(0));

    // insert code here...
    std::cout << "Hello, this is cool giri World!\n";
    return 0;
}

这里是编译日志:

$ clang --version Apple LLVM 版本 4.2 (clang-425.0.24) (基于 LLVM 3.2svn) 目标:x86_64-apple-darwin12.2.0 线程模型:posix $ clang++ main.cpp -stdlib=libc++ -I /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk/usr/include/c++/4.2.1/ -I /usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin11/4.2.1/include/ main.cpp:7:10:错误:命名空间“std”中没有名为“unique_ptr”的成员 std::unique_ptr foo(new int(0)); ~~~~~^ main.cpp:7:24: 错误:对于函数式强制转换或类型构造,预期为 '(' std::unique_ptr foo(new int(0)); ~~~^ main.cpp:7:26:错误:使用未声明的标识符“foo” std::unique_ptr foo(new int(0)); ^ 产生 3 个错误。

【问题讨论】:

  • 是的,我也试过了。结果相同。
  • clang++ -std=c++11 找不到std::unique_ptr 的定义,即使#include &lt;memory&gt; 也是如此。奇怪的编译器这个。使用 gcc。
  • 将 -stdlib=libc++ 添加到您的编译 cmdline 并链接 cmdline。奇怪,我知道,但要这样做。

标签: c++ macos clang xcode4.6


【解决方案1】:

尝试使用 clang 自己的标准库:

clang -std=c++11 -stdlib=libc++ main.cpp

默认是 GNU 的标准库 (libstdc++),但 Apple 包含的版本相当老旧,不支持 C++11。

【讨论】:

  • 我在这里写过这个问题:marshall.calepin.co/…
  • 谢谢!这是理想情况下应该起作用的。但不幸的是,它对我不起作用,因此我尝试了太多东西。
【解决方案2】:

您可以自行查找 Xcode 使用的命令行。

  1. 在 Xcode 中构建您的项目。
  2. 切换到日志视图。它的图标看起来像一个气泡,里面有几行。
  3. 点击最新版本。
  4. 构建步骤列表将显示在主编辑区域中。右键单击“Compile main.cpp”并选择“Copy Transcript for Shown Results”。
  5. 将其粘贴到您喜欢的文本编辑器中,以查看 Xcode 用于构建您的项目的确切命令行。

【讨论】:

  • 谢谢!这很有用。我有兴趣了解 xcode 如何进行编译和链接。但产量相当压倒性。它的巨大命令以之类的东西开头
  • 谢谢!这很有用。我有兴趣了解 xcode 如何进行编译和链接。但产量相当压倒性。它的巨大命令以“/Applications/xcode4.6/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x c++ -arch x86_64 -fmessage-length=0 -std= gnu++11 -stdlib=libc++ ..." 并继续包含项目文件夹中的许多内容。如果我为我提取所需的东西并使用它,它会生成 .o 文件,但链接命令不接受它作为有效文件。我会继续努力。再次感谢。
【解决方案3】:

确保为编译器链接器调用clang++,而不是clang

clang++(作为编译器)需要-std=c++11-stdlib=libc++ compiler 标志,而clang++(作为链接器)需要-stdlib=libc++ 链接器标志。

【讨论】:

    【解决方案4】:

    感谢大家向我提出解决方案,让我继续前进。

    最后这对我有用。

    我使用http://www.cocoanetics.com/2012/07/you-dont-need-the-xcode-command-line-tools/中提到的shell脚本卸载了命令行工具
    然后用 $xcode-select -switch /Applications/Xcode.app/Contents/Developer/ 设置 xcode 版本。最后使用 $xcrun clang++ main1.cpp -stdlib=libc++

    编译我的代码。

    这很好用。谢谢!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2020-10-06
      • 2015-02-16
      • 2019-04-21
      • 2020-11-01
      • 2018-09-28
      • 2014-03-03
      相关资源
      最近更新 更多