问题描述
系统:POP OS IDE: Visual Studio代码
我正在尝试调试一个简单的c ++项目。当我最初设置项目时,调试器将按预期运行。当我添加一个makefile时,不再遇到断点。在添加makefile之前,我是使用 g ++ -g -o main.o main.cpp 从task.json文件编译的。显然,该命令没有执行makefile的操作,但是在我的环境中调试DID即可。
将launch.json设置为stopAtEntry也不起作用。所以我的假设是我编译不正确。
Makefile输出:
g ++ -Wall -I./header -L./lib -c -o source / MqttManager.o source / MqttManager.cpp
g ++ -g -o bin / debug / GenericMqttClient源/main.o源/MqttManager.o -Wall -I./header -L./lib -lpaho-mqtt3c
rm -r ./source / *。o
以下是相关文件:
launch.json
{
"version": "0.2.0","configurations": [
{
"name": "g++ - Build and debug active file","type": "cppdbg","request": "launch","program": "${workspaceFolder}/bin/debug/GenericMqttClient","args": [],"stopAtEntry": false,"cwd": "${workspaceFolder}","environment": [],"externalConsole": false,"MIMode": "gdb","setupCommands": [
{
"description": "Enable pretty-printing for gdb","text": "-enable-pretty-printing","ignoreFailures": true
}
],"preLaunchTask": "C/C++: g++ build active file","miDebuggerPath": "/bin/gdb"
}
]
}
制作文件
CXX = g++
EXENAME = GenericMqttClient
# Directories
HDIR = ./header
LDIR = ./lib
ODIR = ./obj
SDIR = ./source
BIN = ./bin
DEBUGDIR = $(BIN)/debug
RELDIR = $(BIN)/release
# Project Files
SRC = $(wildcard $(SDIR)/*.cpp)
OBJ = $(SRC:.cpp=.o)
# Includes
DEPS = $(HDIR)/MqttManager.h
LIBS = -lpaho-mqtt3c
#flags
CXXFLAGS = -Wall -I$(HDIR) -L$(LDIR)
# DEBUGFLAGS = $(CXXFLAGS) -g
# Object files
$(SDIR)/%.o: %.cpp $(DEPS)
$(CXX) -c -o $@ $< $(CXXFLAGS) $(LIBS)
# Release
release: prep $(RELDIR)/$(EXENAME) objclean
$(RELDIR)/$(EXENAME): $(OBJ)
$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)
# Debug
debug: prep $(DEBUGDIR)/$(EXENAME) objclean
$(DEBUGDIR)/$(EXENAME): $(OBJ)
$(CXX) -g -o $@ $^ $(CXXFLAGS) $(LIBS)
#
# Other Rules
#
all: clean debug release objclean
prep:
@mkdir -p $(DEBUGDIR) $(RELDIR)
objclean:
rm -r $(SDIR)/*.o
clean:
rm -rf $(BIN)/*
让我知道是否应该包含更多文件。
解决方法
您在编译CPP文件时曾经给g ++ -g
开关。现在你不知道了。需要重新添加。
编写Makefile的方式可以取消注释DEBUGFLAGS
的注释,然后在$(CXXFLAGS)
目标中将$(DEBUGFLAGS)
更改为$(SDIR)/%.o
。但是,这也会影响发行版的构建,因此您可能希望找到一种不同的方式来执行此操作,例如通过仅为CXXFLAGS
目标替换debug
定义(这也会影响其依赖性) :
debug: CXXFLAGS=$(DEBUGFLAGS)
debug: prep $(DEBUGDIR)/$(EXENAME) objclean
$(DEBUGDIR)/$(EXENAME): $(OBJ)
$(CXX) -o $@ $^ $(CXXFLAGS) $(LIBS)
我还从链接阶段删除了-g
。该开关需要在编译阶段(不是链接阶段,由debug
目标执行)给出,因为它负责将调试信息写入程序中。这只能从源代码生成,而没有源代码,调试器将无法使用断点。
tl; dr
在引用的结果命令中,需要进行设置,以便将-g
从第二个命令移动到第一个命令:
g++ -Wall -I./header -L./lib -c -o source/MqttManager.o source/MqttManager.cpp
g++ -g -o bin/debug/GenericMqttClient source/main.o source/MqttManager.o -Wall -I./header -L./lib -lpaho-mqtt3c
rm -r ./source/*.o