1

現在、C プロジェクトの Makefile を作成するときに問題に直面しています。

特に、私のプロジェクトには少なくとも 2 つの 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私の2番目の質問は、フラグを両方に同時に追加するにはどうすればよい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です。

次の行のように 2 回繰り返す必要がありますtarget_fullか?

target_full: CFLAGS += -DENABLE_CODE_EXTERNAL_LIB -Iinclude/extra
target_full: LDLIBS += -lext_lib

事前にどうもありがとうございました。

4

1 に答える 1