1、问题:‘make_unique’ is not a member of ‘std’
解决方法:
g++ -std=c++14 your_code.cpp -o your_program 或 g++ -std=c++17 your_code.cpp -o your_program2、VScode 如何用gdb调试
(1)步骤总结
(2)配置 launch.json文件
需要修改的部分:
"name":配置文件名称,可修改也可不修改;
"program":程序可执行文件的完整路径,必须修改且要对应上;
"preLaunchTask":调试会话开始前需要执行的任务的名称,可修改也可不修改,若要修改必须与task.json中的任务名称"label"对应上,否则无法执行任务;
//launch.json文件内容 { "version": "0.2.0", "configurations": [ { "name": "调试threadpool",//可修改也可不修改 "type": "cppdbg", "request": "launch", "program": "${fileDirname}/threadpool",//修改,执行文件是threadpool "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "将反汇编风格设置为 Intel", "text": "-gdb-set disassembly-flavor intel", "ignoreFailures": true } ] }, { "name": "C/C++: g++ 构建和调试活动文件",//可修改也可不修改 "type": "cppdbg", "request": "launch", "program": "${fileDirname}/threadpool",//修改,执行文件是threadpool "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "将反汇编风格设置为 Intel", "text": "-gdb-set disassembly-flavor intel", "ignoreFailures": true } ], "preLaunchTask": "C/C++: g++ 生成活动文件",/若要修改必须与task.json中的任务名称"label"对应上,否则无法执行任务; "miDebuggerPath": "/usr/bin/gdb" }, { "name": "C/C++: g++-9 构建和调试活动文件",//可修改也可不修改 "type": "cppdbg", "request": "launch", "program": "${fileDirname}/threadpool",//修改,执行文件是threadpool "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "将反汇编风格设置为 Intel", "text": "-gdb-set disassembly-flavor intel", "ignoreFailures": true } ], "preLaunchTask": "C/C++: g++-9 生成活动文件",若要修改必须与task.json中的任务名称"label"对应上,否则无法执行任务; "miDebuggerPath": "/usr/bin/gdb" }, { "name": "C/C++: gcc 构建和调试活动文件",//可修改也可不修改 "type": "cppdbg", "request": "launch", "program": "${fileDirname}/threadpool",//修改,执行文件是threadpool "args": [], "stopAtEntry": false, "cwd": "${fileDirname}", "environment": [], "externalConsole": false, "MIMode": "gdb", "setupCommands": [ { "description": "为 gdb 启用整齐打印", "text": "-enable-pretty-printing", "ignoreFailures": true }, { "description": "将反汇编风格设置为 Intel", "text": "-gdb-set disassembly-flavor intel", "ignoreFailures": true } ], "preLaunchTask": "C/C++: gcc 生成活动文件",若要修改必须与task.json中的任务名称"label"对应上,否则无法执行任务; "miDebuggerPath": "/usr/bin/gdb" } ] }(3)配置task.josn文件
需要修改的部分:
"command":需要在调试之前执行的命令文件路径,需要修改为makefile路径,makefile要添加执行权限,且在终端中输入./makefile是可以执行makefile的。
"args":其他要传递给编译器或编译脚本的参数
//task.josn文件内容 { "tasks": [ { "type": "cppbuild", "label": "C/C++: gcc 生成活动文件", "command": "/home/lxl/mythreadpool_project/makefile",//需要修改为makefile路径 "args": [//修改参数 ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "调试器生成的任务。" }, { "type": "cppbuild", "label": "C/C++: g++ 生成活动文件", "command": "/home/lxl/mythreadpool_project/makefile", "args": [ ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": "build", "detail": "调试器生成的任务。" }, { "type": "cppbuild", "label": "C/C++: g++-9 生成活动文件", "command": "/home/lxl/mythreadpool_project/makefile", "args": [ ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": "build", "detail": "调试器生成的任务。" } ], "version": "2.0.0" }//makefile 文件内容 gcc -std=c++17 -Wall -g -c main.cpp #先编译成依赖main.cpp文件生成main.o文件,需要加 -g才能进行调试 gcc -std=c++17 -Wall main.o -g -o threadpool -lpthread -lstdc++ #再用生存的main.o文件生成可执行文件threadpool,需要添加 -lpthread标准库,不然无法执行线程函数,需要添加-lstdc++标准库,因为用 gcc 连接 C++ 程序需要人为指定连接 C++ 标准库,否则就会出现undefined reference to `__gxx_personality_v/0' 之类的错误。注意:
1、 先编译成依赖main.cpp文件生成main.o文件,需要加 -g才能进行调试;
2、再用生存的main.o文件生成可执行文件threadpool,需要加 -g才能进行调试;
3、需要添加 -lpthread标准库,不然无法执行线程函数,需要添加-lstdc++标准库,因为用 gcc 连接 C++ 程序需要人为指定连接 C++ 标准库,否则就会出现undefined reference to `__gxx_personality_v/0' 之类的错误。
4、下面这样的makefile文件内容会出现报错
#makefile #编译器 CXX = g++ #编译选项 CXXFLAGS = -std=c++17 -Wall #目标文件 TARGET = threadpool #源文件 SRCS = main.cpp #threadpool.cpp #目标文件 OBJS = $(SRCS:.cpp=.o) #头文件 HEADERS = threadpool.h #默认目标 all:$(TARGET) #生成可执行文件 $(TARGET):$(OBJS) -$(CXX) $(CXXFLAGS) -o $@ $^ -lpthread -./$(TARGET) #生成目标文件 %.o:%.cpp $(HEADERS) -$(CXX) $(CXXFLAGS) -c $< #清理生成文件 clean: -rm -f $(OBJS) $(TARGET)无法直接执行makefile文件
按照上述步骤进行操作之后就可以进行调试了