c++ - 有人遇到过在 Ubuntu 上找不到 unistd.h 的情况吗?

标签 c++ gcc unistd.h

我在寻找系统中的错误时遇到了困难。从字面上看就是 让我发疯。

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

本质上,我正在尝试编译一些用于点云注册的代码,我没有更新我的机器,我开始看到Boost由于某种原因禁用了线程,产生多个错误,无法找到线程库。我将所有内容回溯到 boost header 的一部分,查看 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/

相关文章:

c++ - 从字节初始化一个由 trivially_copyable 但不是 default_constructible 对象组成的数组。 [intro.object] 中的混淆

c++ - 使用模板在 C++ 中编写一个获取组件的方法

c - 如何指示可以使用内联ASM参数*指向*的内存?

c - 为什么 -O1 比 -O2 快

c - 在c中重定向标准输出然后重置标准输出

c++ - 在 C++ 中是否可以指定使用哪个删除运算符?

c++ - 如何创建自定义查找功能?

c - insmod : ERROR: could not insert module rtl8723be. ko:模块中的未知符号

c++ - unistd read() 不起作用

c - unistd 的 execl() 不传递任何参数