Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Makefile 使用不同目录中的源文件和目标文件自动生成文件_Makefile - Fatal编程技术网

Makefile 使用不同目录中的源文件和目标文件自动生成文件

Makefile 使用不同目录中的源文件和目标文件自动生成文件,makefile,Makefile,我正在尝试组合一个makefile,它将从一个目录(例如src)中获取源文件,将它们编译成另一个目录(例如build)中的目标文件,然后获取这些文件并从主目录中创建一个静态库 以下是我迄今为止的努力: LIBNAME := test LIBNAME := lib$(LIBNAME).a CC = g++ CFLAGS := -O0 -Wall -g -fPIC INCLUDE := include SOURCE := src BUILD := build CPPFILES := $(fore

我正在尝试组合一个makefile,它将从一个目录(例如
src
)中获取源文件,将它们编译成另一个目录(例如
build
)中的目标文件,然后获取这些文件并从主目录中创建一个静态库

以下是我迄今为止的努力:

LIBNAME := test
LIBNAME := lib$(LIBNAME).a

CC = g++
CFLAGS := -O0 -Wall -g -fPIC
INCLUDE := include
SOURCE := src
BUILD := build

CPPFILES := $(foreach dir, $(SOURCE)/, $(notdir $(wildcard $(SOURCE)/*.cpp)))
OBJFILES := $(addprefix $(BUILD)/, $(CPPFILES:.cpp=.o))

all: $(LIBNAME) $(OBJFILES)

$(LIBNAME): $(OBJFILES)
    ar rcs $(LIBNAME) $(OBJFILES)

.cpp.o:
    $(CC) $(CFLAGS) -I$(INCLUDE) -c $< -o $@

clean:
    rm -rf $(BUILD)

无论如何,您似乎都需要GNU make(foreach函数),因此将旧式的后缀规则.cpp.o重写为

$(BUILD)/%.o : $(SOURCE)/%.cpp
我们应该做到这一点。您也可以尝试使用VPATH变量或VPATH指令,请参阅make手册以了解这些内容

一般来说,您可以使用
automake
解决这个问题,它为您提供了大部分这方面的功能

$(BUILD)/%.o : $(SOURCE)/%.cpp