[VisualStudioCode]_[VSCODE]_[C/C++开发环境配置-问题解决和补充]

场景

  1. 在使用VSCode配置C++的开发环境时《VisualStudioCode_C/C++开发环境配置^[1]^》,编译时会发现找不到标准库的std::mutexstd::thread的声明,而这两个的头文件已经引入,什么情况?

  2. 无论如何MinGW都是Windows上验证开发C++特性比较新的工具,就是配置麻烦点。其实免费的话配置麻烦是可以接受的。想避免麻烦的话可以直接使用vsstudio的社区版。

说明

  1. MingGW的预编译版本官方推荐的是在niXman mingw-builds-binaries下载。这个版本我们发现有posixwin32版本,如果下载使用的是win32版本,那么如果要使用标准库thread,必须安装了gthread第三方库。而这个库一般是和gtk一起安装的,很少会用到,就会导致用不了<thread>。解决办法是使用posix线程的版本。如:

    https://github.com/niXman/mingw-builds-binaries/releases/download/13.2.0-rt_v11-rev0/x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0.7z

  2. 如果配置了MinGWbin目录在环境变量path,就不会出现链接问题。如果像我那样不想配置环境变量,需要模拟普通用户一样的环境,集成的终端就会出现以下错误。

    Build finished with error(s).

    E:\software\MinGW-w64\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\bin\g++.exe -std=c++11 -IE:\software\MinGW-w64\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\lib\gcc\x86_64-w64-mingw32\13.2.0\include\c++ -g -o E:\Project\Sample\08.cpp-test\test-synchronized\Debug-MinGW\test-synchronized.exe E:\Project\Sample\08.cpp-test\test-synchronized\test-synchronized\test-synchronized.cpp E:\Project\Sample\08.cpp-test\test-synchronized\test-synchronized\bas_lock.cpp

如果想看具体的信息,那么在外部终端运行,会弹出以下错误。在mingw安装目录下搜索这个cc1plus.exe命令,之后用Dependencies发现它缺少libwinpthread-1.dll文件,而这个文件是在mingw的安装目录bin下。因此编译链接需要有这个bin在搜索路径里,可以在tasks.json里设置当前编译目录是..\bin目录。 方法是在options->cwd里设置。

json 复制代码
{
	"version": "2.0.0",
	"tasks": [
		{
			...
			"options": {
				"cwd": "E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\bin"
			},
			...
			
		}
	]
}
  1. Debug运行的时候如果报错无法调试,也是因为没有配置gdb的搜索路径,gdb也是需要依赖bin目录下的其他文件。所以需要在launch.json配置environment属性值。

    ERROR: Unable to start debugging. Unexpected GDB output from command "-exec-run". During startup program exited with code 0xc000007b.

json 复制代码
"environment": [{"name": "path","value": ";%path%;E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\bin"}],
  1. tasks.json里配置的编译参数,如果要编译多个文件,可以使用gcc的参数。 如果要从任意文件都可以按F5编译运行,那么就需要使用${workspaceFolder}变量^[3]^。
json 复制代码
"args": [
			"-std=c++11",
            "-IE:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\lib\\gcc\\x86_64-w64-mingw32\\13.2.0\\include\\c++",
			"-g",
            "-o",
            "${workspaceFolder}\\Debug-MinGW\\test-synchronized.exe",
			"${workspaceFolder}\\test-synchronized\\test-synchronized.cpp",
			"${workspaceFolder}\\test-synchronized\\bas_lock.cpp"
		],

例子

  1. 这里是优化后的配置, 关键的3个文件,都需要放在.vscode目录下。 当然也可以自己配置执行Makefile的编译。

tasks.json 编译链接配置

json 复制代码
{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "cppbuild",
			"label": "test-synchronized",
			"command": "E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\bin\\g++.exe",
			"args": [
				"-std=c++11",
                "-IE:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\lib\\gcc\\x86_64-w64-mingw32\\13.2.0\\include\\c++",
				"-g",
                "-o",
                "${workspaceFolder}\\Debug-MinGW\\test-synchronized.exe",
				"${workspaceFolder}\\test-synchronized\\test-synchronized.cpp",
				"${workspaceFolder}\\test-synchronized\\bas_lock.cpp"
			],
			"options": {
				"cwd": "E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\bin"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": "build",
			"detail": "compiler: g++.exe"
			
		}
	]
}

c_cpp_properties.json 智能感知声明跳转配置

json 复制代码
{
    "configurations": [
        {
            "name": "MinGW-G++",
            "includePath": [
                "${workspaceFolder}/**",
                "E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\include",
                "E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\x86_64-w64-mingw32\\include",
                "E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\lib\\gcc\\x86_64-w64-mingw32\\13.2.0\\include\\c++",
                "E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\lib\\gcc\\x86_64-w64-mingw32\\13.2.0\\include",
                "E:/software/MinGW-w64/x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0/lib/gcc/x86_64-w64-mingw32/13.2.0/include/c++/x86_64-w64-mingw32"
            ],
            "defines": [
                "_DEBUG",
                "UNICODE",
                "_UNICODE"
            ],
            "windowsSdkVersion": "10.0.22621.0",
            "compilerPath": "E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\bin\\g++.exe",
            "cStandard": "c17",
            "cppStandard": "c++11",
            "intelliSenseMode": "windows-gcc-x64",
            "compilerArgs": []
        }
    ],
    "version": 4
}

launch.json 运行配置

json 复制代码
{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {  
            "name": "MinGW gdb launch",
            "type": "cppdbg",
            "request": "launch",
            "program": "${workspaceFolder}\\Debug-MinGW\\test-synchronized.exe",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "externalConsole": false,
            "environment": [{"name": "path","value": ";%path%;E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\bin"}],
            "preLaunchTask": "test-synchronized",
            "MIMode": "gdb",
            "logging": {
                "moduleLoad": true,
                "trace": true
            },
            // "windows": {"options": {"env": {"path":"C:\\Windows;C:\\Windows\\System32;E:\\software\\cygwin64\\bin"}}},
            "miDebuggerPath": "E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\bin\\gdb.exe",
            "setupCommands": [
                {
                    "description": "asdfas",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ] 
        } 
    ]
}

参考

  1. VisualStudioCode_C/C++开发环境配置

  2. niXman mingw-builds-binaries

  3. Visual Studio Code Variables Reference

相关推荐
程序猿阿伟4 分钟前
《C++ 实现区块链:区块时间戳的存储与验证机制解析》
开发语言·c++·区块链
爱摸鱼的孔乙己42 分钟前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan44 分钟前
C语言:数组转换指针的时机
c语言·开发语言·算法
烦躁的大鼻嘎1 小时前
模拟算法实例讲解:从理论到实践的编程之旅
数据结构·c++·算法·leetcode
IU宝1 小时前
C/C++内存管理
java·c语言·c++
fhvyxyci1 小时前
【C++之STL】摸清 string 的模拟实现(下)
开发语言·c++·string
qq_459730031 小时前
C 语言面向对象
c语言·开发语言
C++忠实粉丝1 小时前
计算机网络socket编程(4)_TCP socket API 详解
网络·数据结构·c++·网络协议·tcp/ip·计算机网络·算法
古月居GYH2 小时前
在C++上实现反射用法
java·开发语言·c++
Betty’s Sweet2 小时前
[C++]:IO流
c++·文件·fstream·sstream·iostream