2013-03-22 227 views
0

編譯我有不尋常的編譯時錯誤,當我編譯下面的代碼:在目錄「無法打開/tmp/ccRBTake.s寫作」,而用gcc

#include <sys/types.h> 
#include <sys/stat.h> 
#include <fcntl.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    if (open("b.txt", O_CREAT | O_RDWR | O_TRUNC, 0777) < 0) { 
     perror("open error:"); 
     exit(1); 
    } 
    return 0; 
} 

,這沒有按」 t包含b.txt
以下是錯誤:

test.c:1:0: fatal error: can’t open /tmp/ccrlx6NY.s for writing: Permission denied 
compilation terminated. 
The bug is not reproducible, so it is likely a hardware or OS problem. 

我使用GNU/Linux (3.2.0-39-generic)操作系統和gcc編譯器版本4.6.3。

$df 
Filesystem  1K-blocks  Used Available Use% Mounted on 
/dev/sda5  44240004 10753148 31239588 26%/
udev    1004132   4 1004128 1% /dev 
tmpfs    406548  1228 405320 1% /run 
none    5120   0  5120 0% /run/lock 
none    1016364  236 1016128 1% /run/shm 
/dev/sda7  80731936 47718056 28912916 63% /home 

什麼可能是確切的原因,我得到這個消息? PS:我現在實際上在編譯的每個文件上都出現這個錯誤。

+0

你可以嘗試'chmod + w/tmp'並重新運行編譯? – Ganesh 2013-03-22 07:15:38

+0

@Ganesh我嘗試'chmod'仍然給出同樣的錯誤。 – mohit 2013-03-22 07:17:38

+0

您能向我們展示您的編譯調用的完整命令行嗎? – 2013-03-22 07:23:45

回答

2

嘗試使用TMPDIR環境變量來強制另一TMP-DIR:

mkdir ~/tmp 
export TMPDIR=~/tmp 
gcc test.c -o mytest 

,並檢查你的umask值。嘗試

umask 022 

並再次調用您的編譯調用。

+1

問題已經解決了,我係統上的'umask'設置爲0777.但是爲什麼我能夠創建文件,但是gcc被拒絕了? – mohit 2013-03-22 12:03:17

0

檢查您是否有對/tmp目錄的寫入訪問權限。還要檢查它是否已滿(儘管在給出錯誤信息的可能性較小)。

您是否可以手工創建/tmp/ccrlx6NY.s

+0

是的,我有權訪問/ tmp目錄。 – mohit 2013-03-22 07:15:41

+0

@mohit:你能手工創建'/ tmp/ccrlx6NY.s'嗎? – NPE 2013-03-22 07:16:26

+0

是的,我可以手工創建'/ tmp/ccrlx6NY.s'。 – mohit 2013-03-22 07:20:34

0

gcc的C編譯器輸出程序集,寫入一個傳遞給彙編程序的臨時文件(擴展名爲.s)。這裏出了什麼問題,是因爲你沒有對/ tmp的寫入權限,所以無法寫入這些文件。

您可以指定gcc用於通過TMPDIR環境變量存儲臨時文件的目錄。

0

您無權寫入/ tmp。 chmod it或要求管理員更改/ tmp中的權限。

+1

我已經在/ tmp中寫入權限,因爲我可以創建文件。 – mohit 2013-03-22 07:26:07

+0

作爲同一個用戶登錄進行編譯? – suspectus 2013-03-22 07:29:20