【问题标题】:Why would clang++ fail to compile on a Mac, under Mavericks, except with sudo?为什么 clang++ 在 Mac 上编译失败,在 Mavericks 下,除了 sudo?
【发布时间】:2014-10-14 04:25:07
【问题描述】:

在我的 mac 上最近一次软件更新后,我无法在没有 sudo 的情况下编译和链接 c++ hello world 程序。

程序(helloworld.cpp):

#include <iostream>

int main(){
  std::cout << "hello world\n";
  return 0;
}

调用:

clang++ helloworld.cpp

因错误而失败:

ld:无法写入输出文件:a.out for architecture x86_64 clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)

但如果我在 sudo 下这样做,

sudo clang++ helloworld.cpp

没问题。

可能是什么原因造成的,我该如何解决?


再次编辑:答案不是工作目录权限,正如几个人建议的那样,而是与我的 hello world 程序的输出文件 a.out 相关的权限.感谢 Petesh 提供的解决方案。

【问题讨论】:

  • 如果目录中已经有一个名为 a.out 的文件,由 root 拥有,那么这正是您将得到的错误。尝试先删除该文件(sudo rm a.out),该命令应该会成功
  • @Petesh:实际上就是这样,我现在觉得很傻。非常感谢。
  • 我不明白...你为什么接受一个没有解决问题的答案???

标签: c++ macos clang xcode6


【解决方案1】:

最有可能的答案是,当您当前的工作目录不是您有权写入的目录时,您正在运行 clang++。

通过运行例如:

尝试确保该目录由您拥有/可写:
sudo chown -R `whoami` .

(请注意,这可能不合适,具体取决于您所在的哪个目录)。

在某些情况下,这发生在之前不需要的项目中的 OSX 更新/升级之后。

【讨论】:

  • 感谢您的想法,但不,这是我的桌面。我对它做了 chmod a+rx,但没有改变。
  • 你也需要 +w。 +rx 表示读取和执行(对于目录,用作 CWD)。
【解决方案2】:

您必须位于用户不可写的目录中。查看pwdls -ld . 以了解您在哪里以及那里有什么权限。尝试在运行 Clang 的同一目录中通过 touch foo.txt 创建一个空文件。

【讨论】:

  • 感谢您的建议,但不,touch foo.txt 工作正常。出于绝望,我已经在我的工作目录 Xcode.app 以及我能找到的所有包含目录上执行了 chmod -R a+rx。
  • @RobLachlan:请向我们展示我提到的命令的输出。确保在运行 Clang 的同一终端中运行它们,没有可能改变环境的干预命令。
  • 它们已连接。我不得不承认,我很困惑。
  • dtruss -f -t open clang++ helloworld.cpp 怎么样?这应该为您打印打开的系统调用,以便您可以看到它失败的路径。
  • 感谢 dtruss 实用程序的指针,这很有帮助。我接受了这个答案,因为它是最接近的,而且很有帮助。
【解决方案3】:

您可能以 root 身份运行 gcc(通过 sudo),因此生成的 a.out 文件归 root 所有。所以只要删除它,问题就会消失。

你为什么这样做?因为烦人的是,xcode 让你以那种方式运行它以同意许可协议!

【讨论】:

  • 为我节省了一两个小时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2013-05-14
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 2012-12-16
相关资源
最近更新 更多