2014-10-26 33 views
0

首先,爲我的無知道歉。我確信我的問題的答案存在於許多現有的makefile線程之一中。但是,我一直無法找到一個能夠簡潔明確地回答我的具體問題,而不會以與我的具體情況無關的細節混淆答案的方法。帶有源碼子目錄的單個頂級makefile

我的代碼目錄有一個包含main的頂級源文件。其餘的源文件根據系統中的邏輯分區在子目錄中組織。該代碼在包含中不包含相對路徑。這意味着一切都完美地工作,如果所有的代碼是使用下面的,簡單的makefile單個目錄:

CC=g++ 
CFLAGS=-c 
LDFLAGS= 
SOURCES=Main.cpp Source1.cpp Source2.cpp Source3.cpp Etc.cpp 
OBJECTS=$(SOURCES:.cpp=.o) 
EXECUTABLE=executable 

all: $(SOURCES) $(EXECUTABLE) 

$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o [email protected] 

.cpp.o: 
    $(CC) $(CFLAGS) $< -o [email protected] 

到現在爲止我一直在建設使用NetBeans IDE我的代碼。這通過爲我的代碼生成一些龐大且過於複雜的makefile來幫助保持我的無知。現在是分配我的代碼供公衆使用的時候了,所以我期望生成一個makefile文件,使我能夠將代碼與我擁有的目錄結構一起分發。

你能幫忙嗎?

Regards, Enthusastic業餘。

回答

1

看看這個:

# Source directories separated by space 
# Example ./ src1/ src2/ 
SRCDIR = ./ src/ 
# Directory where object files will be placed 
OBJDIR = obj/ 
# Include directories separated by space 
# Example: include1/ include2/ 
INCDIR = include/ 
# Directory where binary file will be placed 
BINDIR = bin/ 
# Name of the result file 
TARGET = app 
# Compiler 
CXX  = g++ 

# Retrive list of the source files 
SRC  = $(wildcard $(addsuffix *.cpp,$(SRCDIR))) 
# Generate list of the object files 
OBJ  = $(addprefix $(OBJDIR), $(patsubst %.cpp, %.o, $(notdir $(SRC)))) 

VPATH = $(SRCDIR) 

# Compilation flags 
CXXFLAGS = -std=c++11 -pthread 

$(TARGET) : $(OBJ) 
    @echo Linking... 
    @mkdir -p $(BINDIR) 
    @$(CXX) $(CXXFLAGS) -o $(BINDIR)[email protected] $(OBJ) 

$(OBJDIR)%.o : %.cpp 
    @echo Compiling $< in [email protected] 
    @mkdir -p $(OBJDIR) 
    @$(CXX) $(CXXFLAGS) $(addprefix -I,$(INCDIR)) -c -o [email protected] $< 

clean : 
    @$(RM) -r $(OBJDIR) 
    @$(RM) -r $(BINDIR) 

在這裏,您可以提供多個源目錄。

+0

嘿尼古拉·康德拉特耶夫,對於遲遲不迴應!我與其他工作有牽連,只是剛剛開始測試你的Makefile。 您的貢獻正是我一直在尋找的!非常感謝你! :-) – phlndrwd 2014-11-15 15:42:24

0

如果代碼位於多個目錄中,使用您已有的相同makefile,則「一切正常」。無需更改。

+0

我的舊Makefile的問題是沒有寫入源文件中的頭文件的相對路徑。 – phlndrwd 2014-11-15 15:43:21