2016-09-14 9 views
1

私の状況を説明しましょう: 私は、さまざまな種類のモデルを含むプログラムを持っています(実際の数値はかなり高いですが、10としましょう)。これらのモデルはすべて、名前と対応するファイル "model1.cu"と "model1.h"を持っています。これらのファイルには、1つの浮動小数点数を生成し、それを返す関数があります。これは、同じ引数を持つ同じ名前のすべてのファイルにあります(たとえば、float returnfunction(float voltage)とします)。この特定の機能はメインファイルに必要です。今、私は「MODEL1 = 1を作る」と入力して、正しいモデルを選択することができますマクロはmakefileにありますか?条件付きhファイルのインクルード?

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

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

SRCS += main.c 

:私はあなたが次のようにして計算されるモデル用のコードのみをコンパイルするようにオプションを入れているmakefileで 。この問題は、メインファイルで発生します。関数returnfunction(float voltage)はmodel1.hで定義されているので、それを含める必要があります。私は私のmain.cファイルに

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

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

が含まれている場合でも、私は機能returnfunctionがどこにも定義されていないというエラーが表示されます。 メインファイルに正しいhファイルが含まれていますか? MODEL1 = 1を使用して既にコンパイルしていることをお勧めします。

何か助けていただければ幸いです!

+2

ところで、これを行うためのよりクリーンな方法は、各モデルを個別のサブディレクトリに配置することです。 'model.cu'と' model.h'です。 'VPCS'を設定し、メイクファイルから' -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に追加することができます。たとえば、= 1 MODEL1の場合:あなたはimplicit rulesを使用していると仮定すると、

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

、修正CFLAGSがコンパイルされているすべてのファイルに渡されます。独自のルールを使用してmain.cをコンパイルした場合(そしてCFLAGSを使用していない場合)、変数を作成して明示的に渡すことができます。

1

他の答えは、ポイントにして、あなたの不足している#defineを修正します。私はこれを行うためにクリーナー/ DRYerの方法で残したコメントを拡張します。

最初の部分は、それぞれのモデルが独自のディレクトリにあり、共通のソース/ヘッダー名を持ちます。例えば:私たちは一緒にプレイするつもり

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

(あなたはトップレベルmodelsディレクトリをドロップする可能性がある、重要ではありません)

は、インクルードパスを、あなたからの全#ifdefものをドロップすることができますので、 main.cを入力し、#include <model.h>と置き換えてください。

次に、モデルを指定する方法を少しスマートにしましょう。 MODEL1MODEL2などの代わりに、モデル名を取る汎用のMODEL変数を使用しましょう。makeコマンドはMODEL=model1 makeのようになります(別のvarsを持つことが難しい場合は、ifdef、しかしそれはまだ醜いです)。 Makefileを書くこの時点で

は簡単になり:あなたは、私はちょうどで.oを平手打ちするaddsuffixbasenameを使用ので、Makefileの中で、後にSRCSOBJSを処理しているか

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

私にはわかりませんそこにあなたのニーズにそれを変更することができます。モデルディレクトリをCFLAGS経由でインクルードパスに追加すると、右にmodel.hが表示されます。

また、このようなソースを指定することができます。

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

makeがソースのVPATHになりますので。

その他のもの:C #defineがまだ必要な場合はCFLAGSで追加できます。 .hファイルに共通のものがある場合は、そのファイルをトップレベル.hにリファクタリングすることを検討してください。です。コンパイラがサポートしている場合は、#include_nextも便利です。

関連する問題