c++ - Makefile 隐式规则不起作用

标签 c++ c makefile

我有这个 makefile,我正在尝试编写一些测试目标

#This a make file of serial communication driver that i'm writing.
#serial_target would be a target to test this driver isolated.
 
CC = gcc
 
DISPLAY_STRING = -DDISPLAY_STRING
LFLAGS = 
CFLAGS = $(DISPLAY_STRING) 
 
#mains macros
BUILD_DIR =build
SOURCE_DIR =src
HEADER_DIR =src
BIN_DIR =bin
 
SOURCES = $(wildcard $(SOURCE_DIR)/*.c)
OBJECTS =  $(patsubst $(SOURCE_DIR)/%.c, $(BUILD_DIR)/%.o, $(SOURCES))
HEADERS =  $(patsubst $(SOURCE_DIR)/%.c, $(HEADER_DIR)/%.h, $(SOURCES))
 
 
#serial_tests
TEST_DIR=src/test
TEST_TARGET=serial_test
 
TEST_SOURCES = $(wildcard $(TEST_DIR)/*_test.c) \
    $(SOURCES)
TEST_OBJECTS = $(filter %.o ,$(patsubst %.c, $(BUILD_DIR)/%.o, $(subst /, , $(TEST_SOURCES))))
TEST_HEADERS = $(TEST_SOURCES:.c=.h)
 
 
all:
    
serial_test: $(TEST_OBJECTS)
    $(CC) $(CFLAGS) -I$(SOURCE_DIR) -I$(HEADER_DIR) -o $(BIN_DIR)/$@ $^
    
$(BUILD_DIR)/%.c.o: %.c $(HEADERS)
    $(CC) $(CFLAGS) -I$(HEADER_DIR) -I$(SOURCE_DIR) -c $< -o $@     
 
setup:
    mkdir $(BUILD_DIR)
    mkdir $(BIN_DIR)
    
clean:
    rm -rf $(EXEC) $(OBJECTS)

当运行“make serial_test”时,我总是得到这个:

make: *** No rule to make target `build/serial_test.o', needed by `serial_test'. Stop.

疑点来了。如果规则 $(BUILD_DIR)/%.co 存在,为什么我会收到此错误?

Edit

为了确保其他一切正常,我已经尝试过这个(这个工作正常)

serial_test: $(TEST_OBJECTS)
    $(CC) $(CFLAGS) -I$(SOURCE_DIR) -I$(HEADER_DIR) -o $(BIN_DIR)/$@ $^
build/serial_test.o: src/test/serial_test.c
    $(CC) $(CFLAGS) -I$(HEADER_DIR) -I$(SOURCE_DIR) -c $< -o $@ 
build/serialCom_xsens.o: src/serialCom_xsens.c
    $(CC) $(CFLAGS) -I$(HEADER_DIR) -I$(SOURCE_DIR) -c $< -o $@

为了确保变量 BUILD_DIR 为空,我这样做了:

$(BUILD_DIR)/serial_test.o: %.c
    $(CC) $(CFLAGS) -I$(HEADER_DIR) -I$(SOURCE_DIR) -c $< -o $@

使用上面的代码,我得到了另一个错误:

make: *** No rule to make target `%.c', needed by `build/serial_test.o'. Stop.
  • %.c 和 %.o 规则是否有可能被破坏?

  • 如果您有任何设计技巧,请回答。这也会有帮助。

最佳答案

  • 你混合了模式和后缀规则,坚持模式规则
  • 不完全确定您要使用 TEST_OBJECTS 做什么
  • 您要使每个对象都依赖于每个 header ,而改用依赖性生成
  • serial_test 的规则被破坏,总是使用$@ 作为任何给定规则的输出
  • 将目录作为先决条件
  • 回收内置配方(COMPILE.cLINK.o)
display_string := -Ddisplay_string

source_dir := src
header_dir := src
build_dir  := build
bin_dir    := bin
 
sources := $(wildcard $(source_dir)/*.c)
objects := $(sources:$(source_dir)/%.c=$(build_dir)/%.o)
 
test_dir    := src/test
test_target := serial_test
 
test_sources := $(wildcard $(test_dir)/*_test.c)
test_objects := $(test_sources:$(test_dir)/%.c=$(build_dir)/%.o) $(objects)
 
deps := $(test_objects:%.o=%.d)

CPPFLAGS := $(display_string) -I$(header_dir) -MMD -MP
    
$(bin_dir)/serial_test: $(test_objects) | $(bin_dir)
    $(LINK.o) $^ $(LDLIBS) -o $@
    
$(build_dir)/%.o: $(source_dir)/%.c | $(build_dir)
    $(COMPILE.c) $(OUTPUT_OPTION) $<
 
$(build_dir) $(bin_dir): ; mkdir $@
    
clean: ; $(RM) serial_test $(objects) $(deps)

-include $(deps)

关于c++ - Makefile 隐式规则不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39753899/

相关文章:

C1x : When will it land, 会发生什么?

makefile 分配命令到

c++ - 将非成员非友元函数优先于成员函数

c++ - 为什么有时函数会返回一个 const 或 const 引用

c++ - 用户是否需要满足任何先决条件才能运行 C++17 软件?

c++ - Boost Test BOOST_CHECK_EQUAL 类型可转换为数组

c++ - 可以将 &my_boost_array_variable[2] 传递给期望 void* 的 C 函数吗?

c - 跟踪 Pthread 完成的顺序

c - make : *** [. o]错误1

python - make 在 make 调用期间找不到 OpenCV 库