[英]Make and c++ files, “includes” in the cpp
這是我當前的makefile:
# Compiler #
CXX = g++
DEBUG = -g
LFLAGS =
CXXFLAGS = -Wall
# Directories #
SRCDIR = src/
INCDIR = include/
BUILDDIR = build/
BINDIR = bin/
# Objects #
OBJ_NAMES = main.o dfa.o dfaException.o state.o
OBJS = $(addprefix $(BUILDDIR), $(OBJ_NAMES))
# Output #
NAME = pract3
TARGET = $(BINDIR)pract3
# Clean #
ifeq ($(OS),Windows_NT)
RM = del /q /s $(BUILDDIR:/=\)*.o $(BINDIR:/=\)$(NAME)*
else
RM = rm -rf $(BUILDDIR)*.o $(TARGET)*
endif
# Files #
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) $(LFLAGS) $(OBJS) -o $(TARGET)
$(BUILDDIR)%.o: $(SRCDIR)%.cpp
$(CXX) $(CXXFLAGS) $(LFLAGS) -c $< -o $@
clean:
$(RM)
這是我的項目樹:
Porject/
bin/
build/
doc/
...
include/
connection.hpp
dfa.hpp
dfaException.hpp
state.hpp
src/
dfa.cpp
dfaException.cpp
main.cpp
state.cpp
Makefile
Readme
現在,我遇到了三個“問題”。
首先,我希望我的makefile創建bin並構建目錄,以防萬一。 我想我只需要使用:
mkdir $(BUILDDIR)
mkdir $(BINDIR)
但是我應該放在哪里? 而且,如何防止mkdir和rm(或Windows中的del)消息,例如“無法找到...”或“ x目錄已存在...”
其次,我猜我可以從src /中讀取對象名稱(將.cpp轉換為.o),但是如何從目錄中讀取文件名呢?
最后,我有一個模板類: connection.hpp
(所有函數都在標頭中)。 該文件包含在state.hpp
使用: #include "../include/connection.hpp"
。 我跑make
一次用正確的,然后我特意做語法錯誤connection.hpp
。 然后我再次運行make
,但是它只使用.o
文件編譯了目標文件,沒有任何錯誤。 每次我想編輯connection.hpp
,都必須使用make clean
然后make
。 有什么更好的方法嗎?
如果您需要一個目錄才能繼續進行,只需輸入
mkdir -p ${DIRECTORY}
在規則中需要它之前。 如果該目錄已經存在,則mkdir -p
將不執行任何操作。
同樣,如果你使用rm -f FILE
,它不應該抱怨,如果FILE
沒有在第一時間存在。
沒有一種可移植的方式來創建一個變量來保存目錄中所有文件的名稱。 但是無論如何,您已經在使用GNU Make功能,因此您可以使用
SOURCES = $(wildcard ${SRCDIR}/*.cpp)
接着
OBJECTS = $(SOURCES:.cpp=.o)
將它們轉換為目標文件名。 我想您可能還希望替換前導目錄名稱。
您沒有在make文件中列出任何*.hpp
文件作為先決條件。 您可以手動添加它們,例如
foo.o: foo.cpp bar.hpp baz.hpp
但這很快變得不愉快。 另一個技巧是使用編譯器告訴您文件的頭(包含) #include
d。 如果您使用的是GCC,則可以運行
gcc -MM foo.cpp
使其在make-file片段上方輸出。 您可以像下面這樣放置一個模式規則
%.deps: %.cpp ${CXX} -MM ${CPPFLAGS} $< > $@
放入制作文件,然后include
生成的*.deps
文件。
include $(SOURCES:.cpp=.deps)
GNU Make將足夠聰明,可以首先解析make文件,認識到*.deps
文件不存在,因此不能include
d,但要弄清楚有一個生成規則。 因此它將執行該規則,然后繼續解析生成文件。
我從彼得·米勒(Peter Miller)的精彩文章《 遞歸使被認為有害》中學到了這一技巧,如果您想學習如何編寫優質的make-file,則是一本好書。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.