1

我正在尝试在 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’
4

3 回答 3

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/binand/usr/sbin在您的 PATH 中早于/usr/local/binor /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

无论最初安装的第三方软件是什么,这些东西都可能会损坏,但至少你会知道它是什么。更有可能的是,您将永远不会注意到这样做的任何问题。

于 2012-06-05T00:04:36.853 回答
0

你的mysource.c样子是这样的吗?

#include <stdio.h>

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

如果没有,你能列出mysource.c来让我们看看吗?

于 2012-06-04T23:45:07.657 回答
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.

于 2012-06-04T23:45:10.473 回答