簡體   English   中英

創建一個makefile並在子目錄中進行編譯

[英]Creating a makefile and compiling in subdirectories too

有一個很好的makefile(來自本教程: https : //sites.google.com/site/michaelsafyan/software-engineering/how-to-write-a-makefile )。 但是,正如網站上所提到的,此makefile將所有.c和.cpp文件從單個目錄編譯為可執行文件。

program_NAME := myprogram
program_C_SRCS := $(wildcard *.c)
program_CXX_SRCS := $(wildcard *.cpp)
program_C_OBJS := ${program_C_SRCS:.c=.o}
program_CXX_OBJS := ${program_CXX_SRCS:.cpp=.o}
program_OBJS := $(program_C_OBJS) $(program_CXX_OBJS)
program_INCLUDE_DIRS :=
program_LIBRARY_DIRS :=
program_LIBRARIES :=

CPPFLAGS += $(foreach includedir,$(program_INCLUDE_DIRS),-I$(includedir))
LDFLAGS += $(foreach librarydir,$(program_LIBRARY_DIRS),-L$(librarydir))
LDFLAGS += $(foreach library,$(program_LIBRARIES),-l$(library))

.PHONY: all clean distclean

all: $(program_NAME)

$(program_NAME): $(program_OBJS)
    $(LINK.cc) $(program_OBJS) -o $(program_NAME)

clean:
    @- $(RM) $(program_NAME)
    @- $(RM) $(program_OBJS)

distclean: clean

如何修改此makefile,使其能夠編譯以下程序? 例如,如果我的目錄具有以下結構:

/project
    Makefile
    main.cpp
    /src
        Class1.cpp
        Class2.cpp
    /obj
        Class1.obj
        Class2.obj
    /bin
        myProgram
    /inc
        Class1.h
        Class2.h
    /lib
        libX.a

擔。 正如其他人在評論中提到的那樣,您確實應該使用CMake或其他生成生成文件(和其他項目)的構建系統,而不是手動創建生成文件。

使用我在教程中提供的makefile,了解各個變量代表的內容非常重要。 program_C_SRCSprogram_CXX_SRCS表示要構建的C和C ++源文件。 您可以修改通配符,以便從“ src”目錄而不是從當前目錄中拾取通配符。 同樣, OBJS變量定義了作為輸出生成的目標文件列表。 您可以類似地修改其構造方式,以使它們在“ obj”子目錄中發出(盡管未經進一步測試,我不確定如果xo.cpp跨越不同的目錄,則從x.cpp生成的xo的正常推斷是否將繼續存在) ...您必須自己看看)。

至於包括來自其他目錄的標頭,為此定義了program_INCLUDE_DIRS 只需使用program_INCLUDE_DIRS := inc ,“ inc”文件夾應添加到要搜索包含的目錄列表中。 同樣,你可以通過添加“lib”目錄下,以對庫libX.a庫鏈接program_LIBRARY_DIRS並加入“X”來program_LIBRARIES

無論如何,了解歷史記錄文件的工作方式對於歷史目的以及調試/理解生成文件的工具如何工作都非常有用。 但是,在當今時代,編寫自己的makefile確實是不可取的。 請,請,請花一些時間來學習CMake 雖然在學習新工具(例如CMake)上有一些前期投資,但從長遠來看,通過編寫極易扭曲且構建緩慢的極其嚴重的Makefile,可以節省大量時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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