场景
-
在使用
VSCode
配置C++
的开发环境时《VisualStudioCode_C/C++开发环境配置[1]》,编译时会发现找不到标准库的std::mutex
和std::thread
的声明,而这两个的头文件已经引入,什么情况? -
无论如何
MinGW
都是Windows
上验证开发C++
特性比较新的工具,就是配置麻烦点。其实免费的话配置麻烦是可以接受的。想避免麻烦的话可以直接使用vsstudio
的社区版。
说明
MingGW
的预编译版本官方推荐的是在niXman mingw-builds-binaries下载。这个版本我们发现有posix
和win32
版本,如果下载使用的是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
- 如果配置了
MinGW
的bin
目录在环境变量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
里设置。
{
"version": "2.0.0",
"tasks": [
{
...
"options": {
"cwd": "E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\bin"
},
...
}
]
}
- 在
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.
"environment": [{"name": "path","value": ";%path%;E:\\software\\MinGW-w64\\x86_64-13.2.0-release-posix-seh-msvcrt-rt_v11-rev0\\bin"}],
- 在
tasks.json
里配置的编译参数,如果要编译多个文件,可以使用gcc
的参数。 如果要从任意文件都可以按F5
编译运行,那么就需要使用${workspaceFolder}
变量[3]。
"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"
],
例子
- 这里是优化后的配置, 关键的
3
个文件,都需要放在.vscode
目录下。 当然也可以自己配置执行Makefile
的编译。
tasks.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 智能感知声明跳转配置
{
"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 运行配置
{
// 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
}
]
}
]
}
参考
-
VisualStudioCode_C/C++开发环境配置
-
niXman mingw-builds-binaries
-
Visual Studio Code Variables Reference