我正在尝试在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’
答案 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
下的头文件那样平凡。