3

とりわけ、いくつかのlibrary1.aを出力するMakefileを作成しようとしています。これは、後で実行可能ファイルを作成するために再利用します。これが私のジレンマです。このプロセスを汎用的にしたいので、ファイルを追加するたびに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 に答える