2017-05-30 123 views
1

我有一個邪惡的時間試圖找到我的系統中的錯誤。這實際上是 讓我發瘋。系統:Ubuntu 16.04 LTS,gcc & g ++ 4.9,5.3 5.4可用。任何人都有在Ubuntu上找不到unistd.h的情況?

本質上我試圖爲點雲註冊編譯一些代碼,我沒有更新我的機器,我開始看到Boost出於某種原因禁用了線程,產生了多個錯誤,無法找到線程庫。我回頭追蹤了一部分boost代碼,看GLib的定義,我查了一下,似乎我的編譯器在gcc或g ++中看不到unistd.h。 我檢查了文件,一切都在那裏,但從字面上看不到。 我嘗試使用-I標誌來讓編譯器在目錄中查找。

示例c代碼。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <fcntl.h> 
#include <unistd.h> 
int main (int argc, char *argv[]) 
{ 
    int fd1; 
    char buf[128]; 
    fd1 = open(argv[1], O_WRONLY | O_CREAT); 
    if (fd1 == -1) { 
     perror("File cannot be opened"); 
     return EXIT_FAILURE; 
    } 
    scanf("%127s", buf); 
    write(fd1, buf, strlen(buf)); 
    close(fd1); 
    return 0; 
} 

如果我嘗試使用命令g++ test_unistd.cpp -o main進行編譯,然後我得到

/home/user/test_unistd.cpp: In function ‘int main(int, char**)’: 
/home/user/test_unistd.cpp:20:32: error: ‘write’ was not declared in this scope 
    write(fd1, buf, strlen(buf)); 
           ^
/home/user/test_unistd.cpp:22:14: error: ‘close’ was not declared in this scope 
    close(fd1); 

我所看見的是那裏的文件,我似乎無法找出問題所在。

+1

'g ++ -E test_unistd.cpp -o test_unistd.i'產生了什麼? – melpomene

+3

你得到的錯誤並不是說找不到'unistd.h',所以頭文件出現在你的系統上。該錯誤表示無法找到「寫入」和「關閉」功能。 – Macmade

+0

順便說一句,C不是C++ ...如果這是C++代碼,你可能會遇到編譯器尋找重載的問題...你正在傳遞的參數可能需要Casting ... – Macmade

回答

1

寫了什麼,我們在評論想通了:

有在/usr/local/include/unistd.h OP系統上的一個空文件。 /usr/local包含非託管文件(例如手動安裝的東西)。編譯器首先檢查/usr/local/include(在/usr/include之前),因此您可以使用它來覆蓋系統功能。但是因爲/usr/local/include/unistd.h是空的,包括它沒有效果(除了防止使用真實的unistd.h)。

解決方案:刪除/usr/local/include/unistd.h。這樣可以找到並再次使用/usr/include/unistd.h的真正標題。

相關問題