2015-12-10 86 views
1

我正在尋找一種方法來替換makefile中源文件變量列表中的文件夾。

在這裏有什麼工作嗎?

我開始通過尋找我的源文件

program_C_SRCS := $(wildcard $(SRCDIR)/*.c) 
program_CXX_SRCS := $(wildcard $(SRCDIR)/*.cpp) 

的結果(如果我理解正確的GNU makefile文件)看起來通常喜歡

的src/main.cpp的
的src/sensor.cpp

然後我建立目標文件

program_C_OBJS := ${program_C_SRCS:.c=.o} 
program_CXX_OBJS := ${program_CXX_SRCS:.cpp=.opp} 

這取代了我的源文件的擴展按預期。

最後,我想更換 「的src /」 與 「OBJ /」

program_C_OBJPATH := ${subst $(SRCDIR) , $(OBJDIR) , $(program_C_OBJS)} 
program_CXX_OBJPATH := ${subst $(SRCDIR) , $(OBJDIR) , $(program_CXX_OBJS)} 

但是,這是行不通的。

我已經通過GNU makefile網站無濟於事。此解決方案Makefile to put object files from source files different directories into a single, separate directory?接近,但對象目錄必須顯式包含在任何地方,並且sources目錄不包含源路徑信息。

在我的makefile中,源文件列表包含路徑,我更希望對象文件列表也包含相應的對象目錄。

生成文件的其餘部分也嘗試使用變量

連接階段

$(program_NAME): $(program_OBJS) 
    $(CXX) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) $(program_OBJS) -o "$(program_NAME)" 

編譯階段

%.opp : %.cpp | mkdirobjdir 
    $(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -o "[email protected]" "$<" 

終於規則

main_enose.opp : main_enose.cpp core_enose.cpp core_enose.h 
$(OBJDIR)/core_enose.opp : core_enose.cpp core_enose.h 
$(OBJDIR)/core_enose.h : 

回答

1

你的親這裏的瑕疵是$(subst)調用中逗號周圍的空格。 make不會以你期望的方式忽略它們。它將它們看作字符串中的字面值,要找到的字符串,要替換的字符串以及要替換的字符。

刪除它們。

program_C_OBJPATH := ${subst $(SRCDIR),$(OBJDIR),$(program_C_OBJS)} 
program_CXX_OBJPATH := ${subst $(SRCDIR),$(OBJDIR),$(program_CXX_OBJS)} 

這就是說你可能既想使用$(patsubst)限制在替換過程發生:

program_C_OBJPATH := $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(program_C_OBJS)) 
program_CXX_OBJPATH := $(patsubst $(SRCDIR)/%,$(OBJDIR)/%,$(program_CXX_OBJS)) 

,或者你想使用$(notdir)$(addprefix)處理剝離所有的目錄信息,並將其添加回:

program_C_OBJPATH := $(addprefix $(OBJDIR)/,$(notdir $(program_C_OBJS))) 
program_CXX_OBJPATH := $(addprefix $(OBJDIR)/,$(notdir $(program_CXX_OBJS))) 
+0

謝謝!這工作正常。但似乎稍後解決我的問題。會發生什麼是以下規則不起作用。 '$(program_name):$(program_OBJS)'。它說'make:***'制定目標的規則'obj_dbg/core_enose.opp','程序'需要。 Stop.'看起來鏈接規則是失敗的鏈接規則 – nass

+0

你在哪裏定義了'obj_dbg/core_enose.opp'的規則?你沒有顯示你的makefile的那部分。 –

+0

確實,請現在看看。我意識到現在規則不可能沒有路徑,所以我在它們前綴如下:'$(OBJDIR)/core_enose.opp:$(SRCDIR)/core_enose.cpp $(SRCDIR)/ core_enose.h'。但是這也失敗了。 – nass