7

私のC++プロジェクトのディレクトリ構造は

/..
   makefile     <- the makefile is in root
   /include     <- subdirectory that has to be included while compiling
   /obj         <- target place for all *.o and final executable
   /src         <- sources

そして、私の現在のmakefileは次のとおりです。

CC=g++
CFLAGS=-c -Wall -std=c++11

INC=-Iinclude
SRC=src
TGT=obj

all: myapp

myapp: myapp.o
    $(CC) $(TGT)/myapp.o -o $(TGT)/myapp

myapp.o:
    $(CC) $(CFLAGS) $(INC) $(SRC)/myapp.cpp -o $(TGT)/myapp.o

clean:
    rm -rf $(TGT)
    mkdir $(TGT)

これは私の最初のファイルで機能しました。私は完全なmakefile初心者です-ディレクトリの下のすべてのファイルをコンパイルし、/srcディレクトリ内の実行可能ファイルにリンクするのを手伝ってください/obj

makefileはWindowsで動作する必要があります。私はMinGWとMSYSを使用しています。

4

2 に答える 2

5

ソースファイルのリストを追加します。

SOURCES = $(wildcard $(SRC)/*.cpp)

および対応するオブジェクトファイルのリスト:

OBJS = $(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o)))

およびターゲット実行可能ファイル:

$(TGT)/myapp: $(OBJS)
    $(CXX) $(LDFLAGS) $(OBJS) -o $@

オブジェクトを構築するためのルール:

$(TGT)/%.o: $(SRC)/%.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

ここで、g++のオプションを指定する必要があります。

INCLUDES = -Iinclude
CXXFLAGS = -Wall -std=c++11 $(INCLUDES)

そしてすべて一緒に:

SRC=src
TGT=obj
INCLUDES = -Iinclude
CXXFLAGS = -Wall -std=c++11 $(INCLUDES)
SOURCES = $(wildcard $(SRC)/*.cpp)
OBJS = $(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o)))

$(TGT)/%.o: $(SRC)/%.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

$(TGT)/myapp: $(OBJS)
    $(CXX) $(LDFLAGS) $(OBJS) -o $@

重要なのは、前に$(CXX) ...スペースではなく「タブ」文字がなければならないということです。

于 2012-10-28T14:55:15.597 に答える
1

VPATHソースファイルとオブジェクトファイルを分離するために使用できます。

src/myapp.c
obj/Makefile

既存のものを取得Makefileし、に移動し、へobj/の参照を省略して$(TGT)$(SRC)以下を追加します。

VPATH=../src

マルチアーキテクチャビルドVPATHを実行しようとしている場合は、理想的ではないことに注意してください。


ところで、あなたは組み込みのルールを利用していません。あなたが持っているところ

CC=g++
CFLAGS=-c -Wall -std=c++11
myapp: myapp.o
    $(CC) $(TGT)/myapp.o -o $(TGT)/myapp

myapp.o:
    $(CC) $(CFLAGS) $(INC) $(SRC)/myapp.cpp -o $(TGT)/myapp.o

代わりに次を使用できます:

CXXFLAGS=-Wall -std=c++11
CXXFLAGS+=$(INC)
LDLIBS+=-lstdc++

myapp: myapp.o

したがって、すべてを要約すると、新しいobj/Makefileものは次のようになります。

VPATH=../src
INC=-I../include
CXXFLAGS=-Wall -std=c++11
CXXFLAGS+=$(INC)
LDLIBS+=-lstdc++

myapp: myapp.o

必要に応じて、別のMakefileアップから作成obj/して、この新しいものに再帰することができます。

all: obj/myapp

obj/myapp:
    mklink obj/Makefile ../Makefile
    $(MAKE) --directory=obj/
于 2012-10-28T14:46:19.873 に答える