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をインストールしたところ、同じエラーが発生しています。Snow Leopardを実行している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 開発コンポーネントをインストールしましたか? そうでない場合は、/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

最初にインストールされたサードパーティのソフトウェアが何であれ、壊れる可能性がありますが、少なくともそれが何であったかはわかります. おそらく、そうすることで問題に気付くことはありません。

于 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. しかし、通常、これらは、少なくとも .xml の下のヘッダー ファイルのようにありふれたものに対しては、比較的緩和されたパーミッションを持ちますinclude

于 2012-06-04T23:45:10.473 に答える