我試圖創建一個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 [email protected] $(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文件創建一個單獨的目標,因爲它太亂了。
雖然這不是直接回答您的問題,但我建議您查看cmake來爲您生成Makefile文件。它似乎有你想實現內置的自動化類型。 – jpe
@jpe cmake似乎比手動更復雜。我不得不投入幾天的時間,現在我非常着急編譯這個項目。 –
在CMake中,實際上可以從大約三行或四行中匹配特定模式的所有文件創建一個庫,這比Makefile文件要清晰得多。不是說,在Makefile中「手動」這樣做肯定是一個壞主意,只是不要被CMake所看到,也許看起來複雜而複雜 - 它提供了很多很好的功能,但並不是很難習慣。 – sonicwave