‘fork‘ was not declared in this scope 报错解决

1、背景

使用vscode编译运行下述测试代码:

#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd[2];  // 两个文件描述符
    pid_t pid;
    char buff[20];

    if(pipe(fd) < 0)  // 创建管道
        printf("Create Pipe Error!\n");

    if((pid = fork()) < 0)  // 创建子进程
        printf("Fork Error!\n");
    else if(pid > 0)  // 父进程
    {
        close(fd[0]); // 关闭读端
        write(fd[1], "hello world\n", 12);
    }
    else
    {
        close(fd[1]); // 关闭写端
        read(fd[0], buff, 20);
        printf("%s", buff);
    }

    return 0;
}

发生报错:'fork' was not declared in this scope,'pipe' was not declared in this scope

2、原因

(1)使用fork()函数,需要添加头文件<unistd.h>

(2)但我已经添加了,却还是报错,那是因为,在 Windows 操作系统上,fork() 函数并不直接可用,因为它是 POSIX 标准中的一部分,而 Windows 并不完全支持 POSIX。并且,fork()函数是一个系统调用,并不是C++语言的一部分,所以该错误的发生和MinGW的配置没有关系。

3、解决

(1)放弃windows,切换Linux运行环境,因为Linux支持fork()这些POSIX函数

方法一简单粗暴,但是我舍不得vscode那么简洁美观的IDE,不考虑

(2)使用Windows API

方法二是逃避问题,我就想练习使用fork()还有pipe(),而不是windows自己的什么CreateProcess()、CreateNamePipe(),连参数都不一样,学鸡毛,放弃

(3)使用Cygwin替换MinGW

方法三CSDN上已有详细介绍,参考链接:在Windows环境下使用fork()函数的解决方案_windows下的fock()-CSDN博客

但是配置好像有一堆麻烦要处理,评论区也没几个拍马屁的,我又果断放弃

(4)安装Windows子系统WSL,因为WSL提供了类似Linux的运行环境

方法四看着很高级,就它了。关于如何使用WSL在Windows上安装Linux,参考链接:

安装 WSL | Microsoft Learn

我的实际安装过程:

重启电脑,打开ubuntu,设置Linux用户名和密码

这个Linux文件系统在windows下的实际路径是:

C:\Users\YourUserName\AppData\Local\Packages\CanonicalGroupLimited.UbuntuonWindows_79rhkp1fndgsc\LocalState\ext4.vhdx

回到vscode,提示安装新扩展WSL,点击安装

点击vscode左下角,选择WSL连接

点击底部显示终端,熟悉的linux界面,创建文件夹,新建刚刚的测试cpp文件

安装C/C++扩展,因为是新的运行环境,这是单独的硬盘分区,和原来的windows隔离了

安装code runner,我觉得这一步非常重要,因为只要装了这个就不需要配置复杂的task.json和launch.json,直接鼠标右击选择run code就能运行代码了,太省事了

新环境的GNU工具安装,终端输入下列命令:

sudo apt update
sudo apt install g++ gdb make ninja-build rsync zip

安装完g++需要进行配置,官方这部分的说明文档一大堆,实际卵用没有,只需要下面两步设置就好

然后右击鼠标,点击运行,成功!

4、补充

可能很多人需要task.json和launch.json的具体内容,所以在此补充

不使用code runner情况下,WSL环境下标准的vscode代码编译运行过程:

Terminal -> Run Build Task,配置task.json

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",
            "command": "/usr/bin/g++",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": "build",
            "detail": "compiler: /usr/bin/g++"
        }
    ],
    "version": "2.0.0"
}

Run -> Add Configuration,配置launch.json

{
    // 使用 IntelliSense 了解相关属性。 
    // 悬停以查看现有属性的描述。
    // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        
        
        {
            "name": "g++.exe - 生成和调试活动文件",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "miDebuggerPath": "/usr/bin/gdb",
            "setupCommands": [
                {
                    "description": "为 gdb 启用整齐打印",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++ build active file"
        }
    ]
    
}

点击F5,一样成功运行

5、结语

回过头来看,其实我最终还是选择的方法一,不过是披着windows外衣的linux罢了,最大的好处就是可以使用我那漂亮的vscode,ubuntu的界面我是怎么用怎么觉得丑

如果这篇文章对你有帮助,点个赞喽,有问题的话也欢迎指出^_^

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值