C 在目标中包含来自不同目录的文件

C 在目标中包含来自不同目录的文件,c,makefile,C,Makefile,我有一个编译.so对象的Makefile。现在,需要在不同的对象中编译一些.o,并将它们包含到大型.so中。 这是我的Makefile: CC=gcc FLAGS=-Wall SOURCES=$(shell echo *.c) OBJECTS = $(SOURCES:%.c=%.o) OBJ_FLAGS=-c -fPIC INCL_DIR=./include UTILS_DIR=./utils/ INCLUDES=-I/usr/include -I$(INCL_DIR) -I$(UTILS_

我有一个编译
.so
对象的Makefile。现在,需要在不同的对象中编译一些
.o
,并将它们包含到大型
.so
中。 这是我的Makefile:

CC=gcc
FLAGS=-Wall 
SOURCES=$(shell echo *.c)
OBJECTS = $(SOURCES:%.c=%.o)
OBJ_FLAGS=-c -fPIC

INCL_DIR=./include
UTILS_DIR=./utils/
INCLUDES=-I/usr/include -I$(INCL_DIR) -I$(UTILS_DIR)

TARGET=ap_pcie_lib.so
TARGET_FLAGS=-shared

all: clean build_utils build_obj build_target cleanup

clean:
    @rm -rf *.o *.so build/
    @sudo rm -f $(LIBPATH)$(TARGET)

build_utils:
    make -C utils/ # I wish to use three .o files from here

build_obj: $(OBJECTS)

build_target: $(TARGET)

$(OBJECTS): %.o: %.c
    $(CC) $(CFLAGS) $(INCLUDES) -DTIME=$(TIME) $(OBJ_FLAGS) -o $@ $<

$(TARGET):
    $(CC) $(OBJECTS) $(TARGET_FLAGS) -o $(TARGET)
    
cleanup:
    @rm -r *.o

如果它们是唯一的.o文件,您可以再次使用utils/*.o。

将对象作为先决条件添加到目标规则中,并使用自动变量
$^
在配方中展开它们:

$(TARGET): $(OBJECTS)
    $(CC) $(TARGET_FLAGS) -o $@ $^

# expands into something like "gcc -shared -o ap_pcie_lib.so ap_pcie_lib.o utils/a.o utils/b.o utils/c.o"
$(TARGET): $(OBJECTS)
    $(CC) $(TARGET_FLAGS) -o $@ $^

# expands into something like "gcc -shared -o ap_pcie_lib.so ap_pcie_lib.o utils/a.o utils/b.o utils/c.o"