1

我目前在为 C 项目编写 Makefile 时遇到问题。

特别是,我的项目应该至少有两个 Makefile 目标(target_lighttarget_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

非常感谢您提前。

4

1 回答 1

2

如果target_lighttarget_full共享目标文件,那么当您构建target_light它时会编译不带target_full CFLAGS. 然后,当您构建target_full它时,它不会用 extra 重建现有的目标文件CFLAGS

可能的解决方案:

  1. target_full CFLAGS. 这样,目标文件可以在目标之间共享。
  2. 为不同target_light的目录构建目标文件。在这种情况下,目标文件不会在目标之间共享。target_fullCFLAGS
于 2020-02-05T11:19:18.763 回答