3

我正在尝试创建一个 Makefile,除其他外,它会输出一些 library1.a,之后我将重用它来创建可执行文件。现在这是我的困境:我想让这个过程通用,这样我就不必每次添加一些文件时都编辑 Makefile。这是我的想法:

#Declare phony targets
.PHONY: all clean build_utils

#Compiler
CXX = g++

#Flags
CXXFLAGS = -Wall -Wextra -Wconversion -Werror -pedantic -std=c++0x -O2

#Directories
OUTPUT_DIR = _output/linux
INTERMEDIATE_DIR = _intermediate/linux
UTILS_DIR = utils

all: $(OUTPUT_DIR)/libUtils.a

$(OUTPUT_DIR)/libUtils.a:
    ar rcs $@ $(INTERMEDIATE_DIR)/utils/$(patsubst %.cpp, %.o, $(wildcard $(UTILS_DIR)/ *.cpp))

#create .o files in %INTERMEDIATE_DIR/utils
build_utils: $(UTILS_DIR)/ *.cpp $(UTILS_DIR)/ *.h
    $(CXX) -c $(CXXFLAGS) $^ -o ## What must be placed here? ##

因此,基本上,我希望在临时目录中创建所有目标文件,然后将其存档libUtils.a,但我不知道如何要求编译器根据输入文件输出多个目标文件。基本上,我的标准规定,对于每个 .cpp 文件,我都应该获得一个目标文件,但我不确定如何执行此操作。我不想为每个 .o 文件创建一个单独的目标,因为它太乱了。

4

2 回答 2

3

您可以使用如下通配符规则分别编译每个 C++ 源文件:

%.o: %.cpp
     $(CXX) $< $(CXXFLAGS) $@

-c -o在你的末尾添加后CXXFLAGSpatsubst然后在某处捕获表达式的结果,例如:

OBJECTS = $(patsubst %.cpp, %.o, $(wildcard $(UTILS_DIR)/*.cpp))

...并让$(OUTPUT_DIR)/libUtils.a规则依赖于$(OBJECTS).

于 2012-06-30T13:40:31.007 回答
2

所以,经过几个小时的挖掘,这就是我想出的:

#Build object files
$(INTERMEDIATE_DIR)/$(UTILS_DIR)/%.o: $(UTILS_DIR)/%.cpp $(UTILS_DIR)/%.h
    mkdir -p $(INTERMEDIATE_DIR)/$(UTILS_DIR)
    $(CXX) $< $(LIBCXXFLAGS) -o $@

$(INTERMEDIATE_DIR)/$(FUNCTIONS_DIR)/%.o: $(FUNCTIONS_DIR)/%.cpp $(FUNCTIONS_DIR)/%.h
    mkdir -p $(INTERMEDIATE_DIR)/$(FUNCTIONS_DIR)
    $(CXX) $< $(LIBCXXFLAGS) -o $@


#create the library archives
$(OUTPUT_DIR)/libUtils.a: $(patsubst %.cpp, $(INTERMEDIATE_DIR)/%.o, $(wildcard $(UTILS_DIR)/ *.cpp))
    ar rcs $@ $^
$(OUTPUT_DIR)/libFunctions.a: $(patsubst %.cpp, $(INTERMEDIATE_DIR)/%.o, $(wildcard $(FUNCTIONS_DIR)/ *.cpp))
    ar rcs $@ $^

#Builds the libraries
libs: $(OUTPUT_DIR)/libUtils.a $(OUTPUT_DIR)/libFunctions.a

#Main target
all: libs

关于它的好处是我不必每次添加文件时都对其进行编辑。我认为它可以比这更抽象,通过一个单一的通用目标来构建目标文件,但这似乎有点太多了。

PS:感谢Martin给了我一个关于使用什么的好主意!:)

LE:似乎很难说服 SO 不要尝试进行语法高亮。<pre></pre>在处理/*...时,即使是标签也无济于事

于 2012-06-30T18:11:00.120 回答