场景
-
在使用
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