簡體   English   中英

組織項目並在Makefile中指定目標文件的目錄

[英]organize project and specify directory for object files in Makefile

這是我的兩個問題:

  1. 我現在正在學習使用CVS管理我的代碼,我只想為我的C ++文件,Makefile和bash以及python腳本創建一個存儲庫,而不是目標文件和可執行文件。 所以我在我的項目目錄下創建了幾個子目錄:src,bin,scripts,results和data。

    我把〜/ myproject / src下的C ++文件和Makefile,〜/ myproject / scripts下的Bash和Python腳本以及〜/ myproject / bin下的對象和可執行文件放在下面。 我希望只有src和腳本下的文件才能通過CVS更新。 我想知道你是如何組織你的項目的? 只希望遵循一些好習慣。

  2. 由於我將我的C ++文件和Makefile放入〜/ myproject / src以及對象和可執行文件到〜/ myproject / bin中,我必須在Makefile中指定目錄。 這就是我在做的事情

Makefile文件:

...
BIN_DIR=/home/myproject/bin/

all: $(BIN_DIR)myexecutable TAGS

TAGS: *.cc *.h
    etags --members --declarations -l c++ *.cc *.h

$(BIN_DIR)myexecutable: $(BIN_DIR)myobject.o
    $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

Makefile.depend: *.h *.cc Makefile
    $(CXX) -M $(CXXFLAGS) *.cc > Makefile.depend

clean:
    \rm -f $(BIN_DIR)myexecutable $(BIN_DIR)*.o Makefile.depend TAGS`

但是這會給出錯誤

make:***沒有規則來制作目標/home/myproject/bin/myobject.o', needed by / home / myproject / bin / myexecutable'。

如何在Makefile中的C ++文件中為對象和可執行文件指定不同的目錄?

如果你想學習make,那么GNU make手冊非常好,無論是作為參考還是教程。 您可能需要考慮使用patsubst命令。 以下是我自己的一個使用它的makefile的簡化版本:

OUT = bin/csvfix.exe
CC = g++
IDIR = inc
ODIR = obj
SDIR = src
INC = -Iinc -I../alib/inc
LIBS = ../alib/lib/alib.a -lodbc32 

_OBJS = csved_atable.o \
        csved_case.o \
        csved_cli.o \
        csved_command.o \
        csved_date.o \

OBJS = $(patsubst %,$(ODIR)/%,$(_OBJS))

$(ODIR)/%.o: $(SDIR)/%.cpp 
    $(CC) -c $(INC) -o $@ $< $(CFLAGS) 

$(OUT): $(OBJS)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS)
    strip $(OUT)

clean:
    rm -f $(ODIR)/*.o $(OUT)
  1. 你的目錄結構似乎很合理。

  2. 我會為執行編譯器制定一個明確的規則,比如

TARGET_DIR=bin
SRC_DIR=src
CXX=g++
CXXFLAGS=
ETC=

OBJS=$(TARGET_DIR)/test.o

all: $(OBJS)

$(TARGET_DIR)/%.o: $(SRC_DIR)/%.cc
        $(CXX) -c -o $@ $(CXXFLAGS) $(ETC) $<
  1. 如果您願意,可以將文件保存在不同的目錄中,但這不是必需的。 將文件或目錄添加到CVS存儲庫一次,CVS將無限期地保留它。 從那時起,您可以更新它,檢查它,等等。 如果您不將對象文件添加到存儲庫,CVS將不會觸及它。 如果你想要添加一個完整的目錄樹,並且你習慣於在那里保留對象,那么在你做之前先做好清理。

  2. Make是一個很棒的工具,但它有一些明顯的缺點。 to make something , but not the other way around. 什么你所描述的經典問題之一:讓善於使用源 ,使的東西,而不是周圍的其他方法。 這里有幾種方法可以做你想做的事情。

A)在二進制目錄中運行make:

...
    all: myexecutable TAGS

    myexecutable: myobject.o
        $(CXX) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

    VPATH = /home/myproject/src
    ...

cd~ / myproject / bin
make -f ../src/makefile

B)通過強力將對象放在bin目錄中:

$(BIN_DIR)%.o: %.cc
        $(CXX) $(CXXFLAGS) -c -o $@ $^

這將給你一個Makefile.depend的問題,你可以通過幾種方式。

C)學習一些更先進的制作技巧。 你可能不應該嘗試這個。

使用automakeautoconf構建項目。

至於文件的結構,只需看看任何大型的開源C ++應用程序。 任何KDE應用程序都可以解決這個問題。 如果您發現使用C ++和Python的應用程序更好。

為什么不選擇eclipse,這對於管理大型項目非常流行和方便。 您可以在eclipse中創建一個新項目,從其他項目導入 - 導出代碼到項目中,也可以為您執行版本控制等。不需要編寫make文件,eclipse會根據您在GUI中提到的首選項為您執行此操作。 如果您參與了C ++項目,只需在eclipse上安裝CDT插件即可完成。

暫無
暫無

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

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