$(@:_config=)什么意思?

本文解析了Makefile中的高级技巧,包括特殊变量$(@:_config=)的含义与用途,通过实例演示了如何利用该语法替换目标文件中的特定字符串。此外还探讨了Makefile的基本结构,如目标、依赖和命令等概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

$(@:_config=)什么意思?

已经编译出bin文件了,现在研究一下makefile,把遇到的问题记录下来:

 

1.  $(@:_config=)什么意思?

网上查到如下解释

这里使用了Makefile中的替换引用规则,类似常看到的例子 obj=$(srcfiles:%.c=%.o): 由.c得到对应的.o文件.

这里是一样的道理:
 $(@:_config=) 
 
 @代表的是target smdk2410_config, 那么$(@:_config=)就是将smdk2410_config中的_config替换为空!得到smdk2410; 你可以用echo自己打印出来看看就明白了! 

smdk2410_config : unconfig
  @echo $(@:_config=) # 打印出来看看吧
  @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 

但有一点不明白@代表目标吗?印象里好像是$@ 才代表目标,做了个测试 “

all:

   @echo $@   输出是all

   @echo @    输出是@

   @echo $(@) 输出是all

所以我认为符号@在$()中和$@是一样的

2. 目标 :依赖

        命令

  命令是否可以直接是一个文件名?

做了个测试证明可以:

在外面建立一个makecfg  里面输入 echo i am here !

在makefile 里

all:

    @(路径/makecfg)

 

输入命令make all

就会输出 i am here

``` 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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值