2016-09-14 167 views
1

讓我解釋一下我的情況: 我有一個包含不同類型模型的程序(比方說10,但實際數量相當高)。所有這些模型都有一個名稱和相應的文件「model1.cu」和「model1.h」。所有這些文件都有一個函數,它可以生成一個浮點數並返回它,它在所有名爲相同的文件中具有相同的參數(假設爲float returnfunction(float voltage))。主文件中需要這個特定的功能。 在生成文件我已經把一個選項,這樣你只編譯你將作如下計算模型的代碼:宏在makefile?有條件的h文件包含?

ifdef MODEL1 
SRCS := model1.cu 
OBJS := model1.o 
endif 

ifdef MODEL2 
SRCS := model2.cu 
OBJS := model2.o 
endif 

SRCS += main.c 

現在我可以通過鍵入選擇正確的模式「讓MODEL1 = 1」。主文件中出現問題。函數returnfunction(float voltage)在model1.h中定義,所以我應該包含它。但是,當我包括

#ifdef MODEL1 
#include "model1.h" 
#endif 

#ifdef MODEL2 
#include "model2.h" 
#endif 

在我的main.c文件,我得到的功能returnfunction不被任何定義的錯誤。 有沒有辦法讓我的主文件中包含正確的h文件?最好使用我已經使用MODEL1 = 1進行編譯。

任何幫助,非常感謝!

+2

順便說一句,一個更乾淨的方法是將每個模型放在一個單獨的子目錄中,其中的文件名爲例如'model.cu'和'model.h'。設置'VPATH'並在你的makefile中添加一個'-I'標誌,然後你可以在你的'main.c中設置'SRCS:= model.cu','OBJS:= model.o'和'#include ' '。 –

+0

我喜歡你的想法,但你可以指定使用VPATH和-I嗎?我不熟悉makefile中所有可能的選項,而且文檔通常很難理解。 我想知道的是你要放在makefile中的行(假設地圖被調用:NewModel,它包含model.cu和model.h)(我得到的概念的其餘部分)。是這樣的:#ifdef MODEL1 VPATH = -I ./NewModel #endif? – Tim

+1

對於評論太長了,所以我爲此寫了一個答案,它基本上放棄了你在裏面的每個ifdef。這只是一個建議,接受的答案會修復您的發佈代碼。 –

回答

2

您可以簡單地爲您的每個模型添加一個預處理器定義到您的Makefile中。例如,在MODEL1 = 1的情況下:

ifdef MODEL1 
SRCS := model1.cu 
OBJS := model1.o 
CFLAGS += -DMODEL1 
endif 

假設正在使用的implicit rules,修飾的CFLAGS將被傳遞到每個被編譯的文件。如果你使用自己的規則編譯main.c(並且沒有使用CFLAGS),那麼你可以創建一個變量,並明確地傳遞它。

1

另一個答案是要點,並解決您的缺失#define。我將擴展我在清潔/乾燥方式上留下的評論。

第一部分是讓每個模型在其自己的目錄中,具有通用的源/標題名稱。例如:

├── models 
    ├── model1 
    │ ├── model.cu 
    │ └── model.h 
    ├── model2 
    │ ├── model.cu 
    │ └── model.h 
    └── ... 

(你可能會下降頂級models目錄,無所謂)

我們將與包括路徑玩,這樣你就可以從刪除整個#ifdef東西你main.c並用單個#include <model.h>替換它。

接下來,讓我們對我們如何指定模型有點聰明。我們不使用MODEL1MODEL2等,我們使用一個通用的MODEL變量,它取模型名稱,所以make命令看起來像MODEL=model1 make(如果單獨的變量是一個硬性要求,有很多方法可以做到這一點,而不需要大量的ifdef,但它仍然是醜陋的)。

此時寫Makefile文件變得微不足道:

SRCS := models/$(MODEL)/model.cu main.c 
OBJS := $(addsuffix .o,$(basename $(SRCS))) 
CFLAGS += -Imodels/$(MODEL) 

我不知道該怎麼你在Makefile所以我只是用addsuffixbasename中巴掌.o上處理SRCSOBJS後那裏,但你可以改變它到你的需求。我通過CFLAGS將模型目錄添加到包含路徑,以便它可以選取合適的model.h

你也可以指定來源是這樣的:

VPATH := models/$(MODEL) 
SRCS := model.cu main.c 

因爲化妝會考慮VPATH的來源。

一些雜項的東西:如果你仍然需要一個C #define你可以通過CFLAGS添加它。如果你在.h文件中有一些常見的東西,考慮將它重構成頂級.h然後#include <model.h>。如果你的編譯器支持它,#include_next可能也很方便。