簡體   English   中英

Make和C ++文件,“包含”在cpp中

[英]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 有什么更好的方法嗎?

  1. 如果您需要一個目錄才能繼續進行,只需輸入

     mkdir -p ${DIRECTORY} 

    在規則中需要它之前。 如果該目錄已經存在,則mkdir -p將不執行任何操作。

    同樣,如果你使用rm -f FILE ,它不應該抱怨,如果FILE沒有在第一時間存在。

  2. 沒有一種可移植的方式來創建一個變量來保存目錄中所有文件的名稱。 但是無論如何,您已經在使用GNU Make功能,因此您可以使用

     SOURCES = $(wildcard ${SRCDIR}/*.cpp) 

    接着

     OBJECTS = $(SOURCES:.cpp=.o) 

    將它們轉換為目標文件名。 我想您可能還希望替換前導目錄名稱。

  3. 您沒有在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM