bear make产生的compile_commands.json文件为空

问题:
在这里插入图片描述
解决办法
在这里插入图片描述

``` CONFIG := ../../config/Makefile.config CONFIG_LOCAL := ./config/Makefile.config include $(CONFIG) include $(CONFIG_LOCAL) BUILD_PATH := build SRC_PATH := src/cpp INC_PATH := include CUDA_DIR := /usr/local/cuda-$(CUDA_VER) CXX_SRC += $(wildcard $(SRC_PATH)/*.cpp) KERNELS_SRC := $(wildcard $(SRC_PATH)/*.cu) APP_OBJS := $(patsubst $(SRC_PATH)%, $(BUILD_PATH)%, $(CXX_SRC:.cpp=.cpp.o)) APP_OBJS += $(patsubst $(SRC_PATH)%, $(BUILD_PATH)%, $(KERNELS_SRC:.cu=.cu.o)) APP_MKS := $(APP_OBJS:.o=.mk) APP_DEPS := $(CXX_SRC) APP_DEPS += $(KERNELS_SRC) APP_DEPS += $(wildcard $(SRC_PATH)/*.h) CUCC := $(CUDA_DIR)/bin/nvcc CXXFLAGS := -std=c++11 -pthread -fPIC CUDAFLAGS := --shared -Xcompiler -fPIC INCS := -I $(CUDA_DIR)/include \ -I $(SRC_PATH) \ -I $(OPENCV_INSTALL_DIR) \ -I $(TENSORRT_INSTALL_DIR)/include \ -I $(INC_PATH) LIBS := -L "$(CUDA_DIR)/lib64" \ -L "$(TENSORRT_INSTALL_DIR)/lib" \ -lcudart -lcublas -lcudnn \ -lnvinfer -lnvonnxparser\ -lstdc++fs \ `pkg-config --libs opencv4` ifeq ($(DEBUG),1) CUDAFLAGS += -g -O0 CXXFLAGS += -g -O0 else CUDAFLAGS += -O3 CXXFLAGS += -O3 endif ifeq ($(SHOW_WARNING),1) CUDAFLAGS += -Wall -Wunused-function -Wunused-variable -Wfatal-errors CXXFLAGS += -Wall -Wunused-function -Wunused-variable -Wfatal-errors else CUDAFLAGS += -w CXXFLAGS += -w endif ifeq (, $(shell which bear)) BEARCMD := else ifeq (bear 3.0.18, $(shell bear --version)) BEARCMD := bear --output config/compile_commands.json -- else BEARCMD := bear -o config/compile_commands.json endif endif all: @mkdir -p bin @$(BEARCMD) $(MAKE) --no-print-directory $(APP) @echo finished building $@. Have fun!! run: @$(MAKE) --no-print-directory update @./bin/$(APP) update: $(APP) @echo finished updating $< $(APP): $(APP_DEPS) $(APP_OBJS) @$(CXX) $(APP_OBJS) -o bin/$@ $(LIBS) $(INCS) show: @echo $(BUILD_PATH) @echo $(APP_DEPS) @echo $(INCS) @echo $(APP_OBJS) @echo $(APP_MKS) clean: rm -rf $(APP) rm -rf build rm -rf config/compile_commands.json rm -rf bin ifneq ($(MAKECMDGOALS), clean) -include $(APP_MKS) endif # Compile CXX $(BUILD_PATH)/%.cpp.o: $(SRC_PATH)/%.cpp @echo Compile CXX $@ @mkdir -p $(BUILD_PATH) @$(CXX) -o $@ -c $< $(CXXFLAGS) $(INCS) $(BUILD_PATH)/%.cpp.mk: $(SRC_PATH)/%.cpp @echo Compile Dependence CXX $@ @mkdir -p $(BUILD_PATH) @$(CXX) -M $< -MF $@ -MT $(@:.cpp.mk=.cpp.o) $(CXXFLAGS) $(INCS) # Compile CUDA $(BUILD_PATH)/%.cu.o: $(SRC_PATH)/%.cu @echo Compile CUDA $@ @mkdir -p $(BUILD_PATH) @$(CUCC) -o $@ -c $< $(CUDAFLAGS) $(INCS) $(BUILD_PATH)/%.cu.mk: $(SRC_PATH)%.cu @echo Compile Dependence CUDA $@ @mkdir -p $(BUILD_PATH) @$(CUCC) -M $< -MF $@ -MT $(@:.cu.mk=.cu.o) $(CUDAFLAGS) .PHONY: all update show clean```解释一下每一行什么意思
03-08
Makefile配置文件用于编译C++与CUDA源码项目,并集成了多个库以及工具链选项。下面是对每一部分含义的解析: - 定义变量: ```makefile CONFIG := ../../config/Makefile.config CONFIG_LOCAL := ./config/Makefile.config include $(CONFIG) include $(CONFIG_LOCAL) ``` 设置并引入两个配置文件路径,分别为全局配置和本地覆盖配置[^1]。 - 设置构建参数: ```makefile BUILD_PATH := build SRC_PATH := src/cpp INC_PATH := include CUDA_DIR := /usr/local/cuda-$(CUDA_VER) ``` 定义了项目的构建目录、源代码存放位置、头文件所在位置及CUDA安装根目录[^1]。 - 源文件收集规则: ```makefile CXX_SRC += $(wildcard $(SRC_PATH)/*.cpp) KERNELS_SRC := $(wildcard $(SRC_PATH)/*.cu) APP_OBJS := $(patsubst $(SRC_PATH)%, $(BUILD_PATH)%, $(CXX_SRC:.cpp=.cpp.o)) APP_OBJS += $(patsubst $(SRC_PATH)%, $(BUILD_PATH)%, $(KERNELS_SRC:.cu=.cu.o)) APP_DEPS := $(CXX_SRC) APP_DEPS += $(KERNELS_SRC) APP_DEPS += $(wildcard $(SRC_PATH)/*.h) ``` 自动查找指定路径下的所有`.cpp` 和 `.cu` 文件作为源文件;转换这些源文件名以生成对应的中间目标(即object files),并将它们存放在构建目录下;最后添加依赖项包括所有的头文件[^1]。 - 编译器及相关标志设定: ```makefile CUCC := $(CUDA_DIR)/bin/nvcc CXXFLAGS := -std=c++11 -pthread -fPIC CUDAFLAGS := --shared -Xcompiler -fPIC INCS := -I $(CUDA_DIR)/include \ -I $(SRC_PATH) \ -I $(OPENCV_INSTALL_DIR) \ -I $(TENSORRT_INSTALL_DIR)/include \ -I $(INC_PATH) LIBS := -L "$(CUDA_DIR)/lib64" \ -L "$(TENSORRT_INSTALL_DIR)/lib" \ -lcudart -lcublas -lcudnn \ -lnvinfer -lnvonnxparser\ -lstdc++fs \ `pkg-config --libs opencv4` ``` 指定了CUDA编译命令的位置和其他一些重要的编译标记如标准版本(-std),线程支持(-pthread),位置无关代码(-fPIC)等;还设定了所需的搜索路径(INCS)以便找到必要的头文件,并列出了链接阶段使用的静态或共享库(LIBS)[^1]。 - 调试模式判断: ```makefile ifeq ($(DEBUG),1) CUDAFLAGS += -g -O0 CXXFLAGS += -g -O0 else CUDAFLAGS += -O3 CXXFLAGS += -O3 endif ``` 如果设置了环境变量DEBUG,则开启调试信息-g关闭优化-O0;否则使用最高级别的优化-O3来提升性能[^1]。 - 控制警告显示与否: ```makefile ifeq ($(SHOW_WARNING),1) CUDAFLAGS += -Wall -Wunused-function -Wunused-variable -Wfatal-errors CXXFLAGS += -Wall -Wunused-function -Wunused-variable -Wfatal-errors else CUDAFLAGS += -w CXXFLAGS += -w endif ``` 当启用警示时,增加详细的编译期警告选项;反之则屏蔽掉所有非致命性的告警消息-w[^1]。 - Bear 工具检测与调用逻辑: ```makefile ifeq (, $(shell which bear)) BEARCMD := else ifeq (bear 3.0.18, $(shell bear --version)) BEARCMD := bear --output config/compile_commands.json -- else BEARCMD := bear -o config/compile_commands.json endif endif ``` 先检查系统内是否存在Bear工具及其具体版本号,根据不同的情况构造适当的命令行参数字符串[^1]。 - 主要任务描述符(`target`): ```makefile all: @mkdir -p bin @$(BEARCMD) $(MAKE) --no-print-directory $(APP) @echo finished building $@. Have fun!! run: @$(MAKE) --no-print-directory update @./bin/$(APP) update: $(APP) @echo finished updating $< $(APP): $(APP_DEPS) $(APP_OBJS) @$(CXX) $(APP_OBJS) -o bin/$@ $(LIBS) $(INCS) show: @echo $(BUILD_PATH) @echo $(APP_DEPS) @echo $(INCS) @echo $(APP_OBJS) @echo $(APP_MKS) clean: rm -rf $(APP) rm -rf build rm -rf config/compile_commands.json rm -rf bin ``` 这里定义了几种常见的操作行为,比如创建可执行程序(all),运行应用程序(run),更新已有二进制(update),展示当前的一些内部状态(show),清理之前产生的结果(clean)[^1]。 - 规定每个具体的.cpp/.cu文件如何转化为对应的目标文件(.cpp.o,.cu.o): ```makefile # Compile CXX $(BUILD_PATH)/%.cpp.o: $(SRC_PATH)/%.cpp @echo Compile CXX $@ @mkdir -p $(BUILD_PATH) @$(CXX) -o $@ -c $< $(CXXFLAGS) $(INCS) $(BUILD_PATH)/%.cpp.mk: $(SRC_PATH)/%.cpp @echo Compile Dependence CXX $@ @mkdir -p $(BUILD_PATH) @$(CXX) -M $< -MF $@ -MT $(@:.cpp.mk=.cpp.o) $(CXXFLAGS) $(INCS) # Compile CUDA $(BUILD_PATH)/%.cu.o: $(SRC_PATH)/%.cu @echo Compile CUDA $@ @mkdir -p $(BUILD_PATH) @$(CUCC) -o $@ -c $< $(CUDAFLAGS) $(INCS) $(BUILD_PATH)/%.cu.mk: $(SRC_PATH)%.cu @echo Compile Dependence CUDA $@ @mkdir -p $(BUILD_PATH) @$(CUCC) -M $< -MF $@ -MT $(@:.cu.mk=.cu.o) $(CUDAFLAGS) ``` 对于每一个匹配上述模式的源文件,在实际执行过程中会依据相应的编译指令来进行预处理、编译等工作[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值