尝试在Mac终端中编译hello world C程序时出现Permission Denied错误

时间:2012-06-04 23:41:12

标签: c macos terminal permission-denied

我正在尝试在mac终端中编译一个hello world c程序,我正在生成这些错误:

mysource.c:1:19: error: /usr/local/include/stdio.h: Permission denied
mysource.c: In function ‘main’:
mysource.c:3: warning: incompatible implicit declaration of built-in function ‘printf’

这是我输入终端的内容(mysource是.c文件的名称):

MacBook-Pro:~ drummer0014$ gcc mysource.c -o mysource

我安装了xcode 3并生成了相同的错误,所以我今天刚刚安装了xcode 4.2并且遇到了同样的错误。我在运行雪豹的macbook上。 我也尝试输入gcc,然后将文件拖到终端,这样它就会有完整的路径,但我得到了同样的错误。任何帮助将不胜感激。

当我输入gcc --verbose mysource.c -o mysource时 这是我收到的:

    Using built-in specs.
    Target: i686-apple-darwin10
    Configured with: /private/var/tmp/llvmgcc42/llvmgcc42-2336.1~3/src/configure --disable-         checking --enable-werror --prefix=/Developer/usr/llvm-gcc-4.2 --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-prefix=llvm- --program-transform-name=/^[cg][^.-]*$/s/$/-4.2/ --with-slibdir=/usr/lib --build=i686-apple-darwin10 --enable-         llvm=/private/var/tmp/llvmgcc42/llvmgcc42-2336.1~3/dst-llvmCore/Developer/usr/local --program-prefix=i686-apple-darwin10- --host=x86_64-apple-darwin10 --target=i686-apple-darwin10 --with-gxx-include-dir=/usr/include/c++/4.2.1
Thread model: posix
    gcc version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00)
     /usr/llvm-gcc-4.2/bin/../libexec/gcc/i686-apple-darwin10/4.2.1/cc1 -quiet -v -imultilib    x86_64 -iprefix /usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin10/4.2.1/ -D__DYNAMIC__ mysource.c -fPIC -quiet -dumpbase mysource.c -mmacosx-version-min=10.6.8 -m64 -mtune=core2 -auxbase mysource -version -o /var/folders/7r/7rMZhHx3F0WhnoyEK1zUgE+++TI/-Tmp-//ccaqeJkd.s
ignoring nonexistent directory "/usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin10/4.2.1/../../../../i686-apple-darwin10/include"
ignoring nonexistent directory "/Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin10/4.2.1/../../../../i686-apple-darwin10/include"
    #include "..." search starts here:
    #include <...> search starts here:
     /usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin10/4.2.1/include
     /usr/local/include
     /Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin10/4.2.1/include
     /usr/include
     /System/Library/Frameworks (framework directory)
     /Library/Frameworks (framework directory)
    End of search list.
    GNU C version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00) (i686-apple-    darwin10)
    compiled by GNU C version 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.1.00).
    GGC heuristics: --param ggc-min-expand=150 --param ggc-min-heapsize=131072
    Compiler executable checksum: e787fa4ffdc9e78ad5e913828c220d85
    mysource.c:1:19: error: /usr/local/include/stdio.h: Permission denied
    mysource.c: In function ‘main’:
    mysource.c:3: warning: incompatible implicit declaration of built-in function ‘printf’

3 个答案:

答案 0 :(得分:3)

STATUS_ACCESS_DENIED有点正确,但我暂时不会更改/usr/local的权限。在典型的Mac OS X安装中,/usr/local不用于任何内容。如果发生任何事情,那就是第三方软件。

所以,真正的问题是为什么GCC在那里寻找(并找到)标题。我怀疑是因为你没有从Xcode运行GCC,而是在/ usr / local中有第三方版本的GCC。

which gcc报告什么? echo $PATH显示什么?

安装Xcode时,是否安装了UNIX Development组件?如果没有,那么您必须显式地访问/ Developer / usr / bin中的工具,或者在PATH的早期添加该目录。如果您确实安装了该组件,请确保您的路径/usr/bin/usr/sbin早于/usr/local/bin/usr/local/sbin


更新

嗯,gcc --verbose输出的有趣部分是:

#include "..." search starts here:
#include <...> search starts here:
 /usr/llvm-gcc-4.2/bin/../lib/gcc/i686-apple-darwin10/4.2.1/include
 /usr/local/include
 /Developer/usr/llvm-gcc-4.2/lib/gcc/i686-apple-darwin10/4.2.1/include
 /usr/include
 /System/Library/Frameworks (framework directory)
 /Library/Frameworks (framework directory)
End of search list.

我刚检查了我的系统,llvm-gcc-4.2(实际使用的编译器)在这里生成了相同的搜索列表。所以,我想编译器在/usr/local/include中查找标题是正常的 - 并且在/usr/include之前看一下 - 这只是异常的,你会有任何标题。

我的建议是你放在一边/usr/local

sudo mv /usr/local /usr/local.bak

或至少/usr/local/include/usr/local/lib

sudo mv /usr/local/include /usr/local/include.bak
sudo mv /usr/local/lib /usr/local/lib.bak

无论最初安装的第三方软件是什么东西都可能破坏,但至少你会知道它是什么。更有可能的是,你永远不会发现任何问题。

答案 1 :(得分:0)

您的mysource.c看起来是这样吗?

#include <stdio.h>

int main()
{
    printf("hello, world\n");
    return 0;
}

如果没有,您会列出mysource.c以便我们查看吗?

答案 2 :(得分:0)

mlp指出了一个非常相关的事实。如果您使用#include "stdio.h"代替#include <stdio.h>,则标题的搜索(订单等)会有所不同。由于这是标准标头,请先尝试使用#include <stdio.h>重新编译。如果这没有帮助,我认为我们必须假设这是一个许可问题。


很明显,您的用户无法访问gcc标题所在的位置,尤其是/usr/local/include/stdio.h。确保sudo chmod o+rX /usr/local/include授予任何人对此位置的读取权限(您需要超级用户权限才能执行此操作!),然后再次尝试编译。

现在的原因是:

mysource.c:3: warning: incompatible implicit declaration of built-in function ‘printf’

也很明显。如果由于权限问题而无法读取头文件,则无法包含头文件,并且C默认为标准行为,假设函数返回int和任意数量的参数。


现在我不是100%关于权限的语义,但是层次结构中较高层的某些文件夹也可能需要修复,即/usr/local/usr。但通常这些权限会相对宽松,至少对于像include下的头文件那样平凡。