我目前在为 C 项目编写 Makefile 时遇到问题。
特别是,我的项目应该至少有两个 Makefile 目标(target_light
和target_full
),这target_light
是默认的。
target_light
应该编译我所有的源文件,除了少数需要在系统上安装外部库的文件(保存在src/extra
, 用于 .c 文件和include/extra
, 用于 .h 文件)。
target_full
应该编译所有文件,包括需要外部库的文件。它还应该在CFLAGS
和中添加一些标志LDLIBS
。
我目前有一个类似于以下的 Makefile:
EXECNAME=MyExecutable
CC=gcc
SRC_DIR=src
OBJ_DIR=obj
SRC_DIR_EXTERNAL_FILES=src/extra
OBJ_DIR_EXTERNAL_FILES=obj/extra
SRC=$(wildcard $(SRC_DIR)/*.c)
OBJ=$(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
SRC_EXTERNAL_FILES=$(wildcard $(SRC_DIR_EXTERNAL_FILES)/*.c)
OBJ_EXTERNAL_FILES=$(SRC_EXTERNAL_FILES:$(SRC_DIR_EXTERNAL_FILES)/%.c=$(OBJ_DIR_EXTERNAL_FILES)/%.o)
CFLAGS += -Wall -O2 -Iinclude
LDLIBS += -lpthread -lm
.PHONY: all clean
all: target_light
target_light: CC=gcc
target_light_embedded: CC=x86_64-openwrt-linux-musl-gcc
target_light_debug: CFLAGS += -g
target_light_debug: target_light
target_light target_light_debug target_light_embedded: $(EXECNAME)
$(EXECNAME): $(OBJ_CC)
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
$(CC) $(CFLAGS) -c $< -o $@
clean:
$(RM) $(OBJ_DIR)/*.o $(OBJ_DIR_EXTERNAL_FILES)/*.o
$(RM) $(EXECNAME)
-rm -rf $(OBJ_DIR)
我目前正在努力寻找一种添加target_full
到这个 Makefile 的方法,它也应该考虑到SRC_DIR_EXTERNAL_FILES
OBJ_DIR_EXTERNAL_FILES
SRC_EXTERNAL_FILES
OBJ_EXTERNAL_FILES
,以便仅在请求时编译附加文件。
我该如何执行此操作?在 Makefile 中是否有这样做的好方法?
我的第二个问题是:如何同时向两者添加标志,CFLAGS
并且LDLIBS
仅在target_full
选择时才添加?我试着写:
target_full: CFLAGS += -DENABLE_CODE_EXTERNAL_LIB -Iinclude/extra
LDLIBS += -lext_lib
然后将$(EXECNAME)
行更改为:
target_light target_light_debug target_light_embedded target_full: $(EXECNAME)
但LDLIBS
似乎总是考虑附加标志,即使target_light
选择时也是如此。
我应该做类似以下几行的事情,重复两次target_full
吗?
target_full: CFLAGS += -DENABLE_CODE_EXTERNAL_LIB -Iinclude/extra
target_full: LDLIBS += -lext_lib
非常感谢您提前。