亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將目標文件放在單獨的子目錄中

如何將目標文件放在單獨的子目錄中

我在嘗試使用make將目標文件放在單獨的子目錄中時遇到麻煩,這可能是一種非?;镜募夹g。我試圖使用此頁面中的信息:http : //www.gnu.org/software/hello/manual/make/Prerequisite-Types.html#Prerequisite-Types我從make得到以下輸出:make: *** No rule to make target `ku.h', needed by `obj/kumain.o'.  Stop.但是ku.h不是目標而是依賴關系(盡管它顯然已#include在c源文件中)。當我不嘗試使用子目錄存儲目標文件時(即錯過OBJDIR部分),它可以正常工作。為什么使ku.h是目標?我的makefile是這樣的:(樣式是在閱讀了各種信息源之后的).SUFFIXES:.SUFFIXES: .c .oCC=gcc CPPFLAGS=-WallLDLIBS=-lhpdfVPATH=%.c srcVPATH=%.h srcVPATH=%.o objOBJDIR=objobjects= $(addprefix $(OBJDIR)/, kumain.o kudlx.o kusolvesk.o kugetpuz.o kuutils.o \  kurand.o kuASCboard.o kuPDFs.o kupuzstrings.o kugensud.o \  kushapes.o )ku : $(objects)  $(CC) $(CPPFLAGS) -o ku $(objects) $(LDLIBS)$(objects) : ku.h kudefines.h kuglobals.h kufns.h | $(OBJDIR)$(OBJDIR):  mkdir $(OBJDIR).PHONY: cleanclean :  rm $(objects)編輯:我應用更改以使用vpath指令。我的版本是VPATH = xxx和vpath%.c xxx的不良混合。但是,我現在遇到了另一個問題(這是我添加錯誤的vpath之前的原始問題)?,F在是輸出:    gcc  -o ku -lhpdf obj/kumain.o obj/kudlx.o obj/kusolvesk.o ..etc    gcc: obj/kumain.o: No such file or directory    gcc: obj/kudlx.o: No such file or directory    gcc: obj/kusolvesk.o: No such file or directory    gcc: obj/kugetpuz.o: No such file or directory    gcc: obj/kuutils.o: No such file or directory    gcc: obj/kurand.o: No such file or directory    gcc: obj/kuASCboard.o: No such file or directory    gcc: obj/kuPDFs.o: No such file or directory    gcc: obj/kupuzstrings.o: No such file or directory    gcc: obj/kugensud.o: No such file or directory    gcc: obj/kushapes.o: No such file or directory    make: *** [ku] Error 1盡管手冊中說“隱式規則告訴make如何使用慣用技術,以便您不必在使用它們時詳細指定它們,但make似乎并未將隱式規則應用于目標文件。是C編譯的隱式規則,文件名決定運行哪些隱式規則,例如,C編譯通常需要一個.c文件并創建一個.o文件,因此當make看到此組合時,make將隱式規則應用于C編譯。文件名結尾?!?以及“在考慮隱式規則的過程中也會發生在VPATH或vpath中指定目錄的搜索(請參閱使用隱式規則)?!痹俅卧诖颂帯袄?,當文件foo.o沒有顯式規則時,make考慮隱式規則,例如內置規則,以編譯foo.c(如果該文件存在。如果當前目錄中缺少該文件,在適當的目錄中進行搜索。如果在任何目錄中都存在foo.c(或在makefile中提到),則將應用C編譯的隱式規則?!痹谑闺[式規則適用于我的makefile方面的任何幫助將不勝感激。
查看完整描述

3 回答

?
當年話下

TA貢獻1890條經驗 獲得超9個贊

由于您使用的是GNUmake,因此請使用模式規則來編譯目標文件:


$(OBJDIR)/%.o: %.c

    $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<


查看完整回答
反對 回復 2019-10-08
?
慕哥6287543

TA貢獻1831條經驗 獲得超10個贊

這是我用于大多數項目的makefile,


它允許將源文件,頭文件和內聯文件放在子文件夾以及子文件夾的子文件夾等中,并會自動為每個對象生成一個依賴文件。這意味著對頭文件和內聯文件的修改將觸發對相關文件的重新編譯。


通過shell find命令檢測到源文件,因此無需明確指定,只需對您的內容進行編碼即可。


編譯項目時,它還將所有文件從“資源”文件夾復制到bin文件夾中,而我在大多數情況下都很方便。


為了提供應有的信譽,自動依賴功能主要基于Scott McPeak的頁面(可在此處找到),并進行了一些其他修改/調整以滿足我的需求。


示例文件


#Compiler and Linker

CC          := g++-mp-4.7


#The Target Binary Program

TARGET      := program


#The Directories, Source, Includes, Objects, Binary and Resources

SRCDIR      := src

INCDIR      := inc

BUILDDIR    := obj

TARGETDIR   := bin

RESDIR      := res

SRCEXT      := cpp

DEPEXT      := d

OBJEXT      := o


#Flags, Libraries and Includes

CFLAGS      := -fopenmp -Wall -O3 -g

LIB         := -fopenmp -lm -larmadillo

INC         := -I$(INCDIR) -I/usr/local/include

INCDEP      := -I$(INCDIR)


#---------------------------------------------------------------------------------

#DO NOT EDIT BELOW THIS LINE

#---------------------------------------------------------------------------------

SOURCES     := $(shell find $(SRCDIR) -type f -name *.$(SRCEXT))

OBJECTS     := $(patsubst $(SRCDIR)/%,$(BUILDDIR)/%,$(SOURCES:.$(SRCEXT)=.$(OBJEXT)))


#Defauilt Make

all: resources $(TARGET)


#Remake

remake: cleaner all


#Copy Resources from Resources Directory to Target Directory

resources: directories

    @cp $(RESDIR)/* $(TARGETDIR)/


#Make the Directories

directories:

    @mkdir -p $(TARGETDIR)

    @mkdir -p $(BUILDDIR)


#Clean only Objecst

clean:

    @$(RM) -rf $(BUILDDIR)


#Full Clean, Objects and Binaries

cleaner: clean

    @$(RM) -rf $(TARGETDIR)


#Pull in dependency info for *existing* .o files

-include $(OBJECTS:.$(OBJEXT)=.$(DEPEXT))


#Link

$(TARGET): $(OBJECTS)

    $(CC) -o $(TARGETDIR)/$(TARGET) $^ $(LIB)


#Compile

$(BUILDDIR)/%.$(OBJEXT): $(SRCDIR)/%.$(SRCEXT)

    @mkdir -p $(dir $@)

    $(CC) $(CFLAGS) $(INC) -c -o $@ $<

    @$(CC) $(CFLAGS) $(INCDEP) -MM $(SRCDIR)/$*.$(SRCEXT) > $(BUILDDIR)/$*.$(DEPEXT)

    @cp -f $(BUILDDIR)/$*.$(DEPEXT) $(BUILDDIR)/$*.$(DEPEXT).tmp

    @sed -e 's|.*:|$(BUILDDIR)/$*.$(OBJEXT):|' < $(BUILDDIR)/$*.$(DEPEXT).tmp > $(BUILDDIR)/$*.$(DEPEXT)

    @sed -e 's/.*://' -e 's/\\$$//' < $(BUILDDIR)/$*.$(DEPEXT).tmp | fmt -1 | sed -e 's/^ *//' -e 's/$$/:/' >> $(BUILDDIR)/$*.$(DEPEXT)

    @rm -f $(BUILDDIR)/$*.$(DEPEXT).tmp


#Non-File Targets

.PHONY: all remake clean cleaner resources


查看完整回答
反對 回復 2019-10-08
  • 3 回答
  • 0 關注
  • 1033 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號