从多个源创建静态库

时间:2012-06-30 13:31:50

标签: c++ linux makefile

我正在尝试创建一个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文件创建一个单独的目标,因为它太乱了。

2 个答案:

答案 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> ...

时,/*标记甚至没有帮助