簡體   English   中英

嘗試在Mac終端中編譯hello world C程序時出現Permission Denied錯誤

[英]Permission Denied error when trying to compile hello world C program in Mac terminal

我正在嘗試在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’

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在PATH中比/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

無論最初安裝的第三方軟件是什么東西都可能破壞,但至少你知道它是什么。 更有可能的是,你永遠不會注意到這樣做的任何問題。

你的mysource.c看起來像這樣嗎?

#include <stdio.h>

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

如果沒有,你會列出mysource.c以便我們可以看一下嗎?

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在頭文件下的平凡文件而言。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM