我度过了一段痛苦的时光,试图在系统中查找错误。从字面上看
气死我了

系统:可用的Ubuntu 16.04 LTS,gcc&g++ 4.9、5.3 5.4。

本质上,我正在尝试编译一些代码以进行点云注册,没有更新我的机器,我开始看到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);

我可以看到的所有文件都在那里,我似乎无法弄清楚问题出在哪里。

最佳答案

写出我们在评论中发现的内容:

OP的系统上/usr/local/include/unistd.h处有一个空文件。 /usr/local包含非托管文件(例如,您手动安装的文件)。编译器首先检查/usr/local/include(在/usr/include之前),因此您可以使用它来覆盖系统功能。但是因为/usr/local/include/unistd.h是空的,所以包括它没有任何作用(除了阻止使用真正的unistd.h之外)。

解决方案:删除/usr/local/include/unistd.h。这样,就可以找到并再次使用/usr/include/unistd.h的真实 header 。

关于c++ - 有人遇到过在Ubuntu上找不到unistd.h的情况吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44270490/

10-11 23:19