我正在尝试创建一个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文件创建一个单独的目标,因为它太乱了。
答案 0 :(得分:1)
您可以使用如下所示的通配符规则分别编译每个C ++源文件:
%.o: %.cpp
$(CXX) $< $(CXXFLAGS) $@
在-c -o
的末尾添加CXXFLAGS
。然后在某处捕获patsubst
表达式的结果,如:
OBJECTS = $(patsubst %.cpp, %.o, $(wildcard $(UTILS_DIR)/*.cpp))
...让$(OUTPUT_DIR)/libUtils.a
规则取决于$(OBJECTS)
。
答案 1 :(得分:0)
所以,经过几个小时的挖掘,这就是我设法提出来的:
#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>
...
/*
标记甚至没有帮助