2011-01-21 7 views
2

メイクファイルは以下に含まれています。これは、オブジェクトファイルと2つのターゲットの長いリストです。問題は、最初のターゲットで$(INC)が無視されているようです。たとえば、出力は "g ++ -I/usr/home/jrm/tmp/proteus_beta -c -o main.o main.cpp"の代わりに "g ++ -c -o main.o main.cpp"で始まります。gnu makeファイルで無視されるインクルードパス

TIA

PROG = proteus 

# list of object files 
OBJS = main.o \ 
dataset.o \ 
genetic_codes.o \ 
likelihood_engine.o \ 
options.o \ 
parsimony.o \ 
parsimony_engine.o \ 
seq.o \ 
site_collection.o \ 
site_pattern.o \ 
tools.o \ 
optare/crs.o \ 
optare/point.o \ 
optare/newton_1d.o \ 
optare/golden_section.o \ 
models/model.o \ 
models/DNA/DNA_model.o \ 
models/DNA/DNA_ssm.o \ 
models/CODON/CODON_model.o \ 
models/CODON/CODON_modelA.o \ 
models/CODON/CODON_modelB.o \ 
models/CODON/CODON_modelC.o \ 
models/CODON/CODON_modelD.o \ 
models/CODON/CODON_M0.o \ 
models/CODON/CODON_M1.o \ 
models/CODON/CODON_M2.o \ 
models/CODON/CODON_M3.o \ 
models/CODON/CODON_M0gtr.o \ 
models/CODON/CODON_FEBC1.o \ 
models/CODON/CODON_FEBC1b.o \ 
models/CODON/FESC/CODON_FESC1.o \ 
models/CODON/CODON_nh/CODON_M0nh1.0 \ 
models/CODON/CODON_nh/CODON_M1nh1.0 \ 
models/CODON/CODON_nh/CODON_M1nh1.0 \ 
models/CODON/CODON_nh/CODON_M3nh1.0 \ 
models/CODON/CODON_nh/CODON_M0nh2.0 \ 
models/CODON/CODON_nh/CODON_MmodelAnh2.0 \ 
matrices/matrix.o \ 
matrices/DNA_matrix.o \ 
matrices/CODON_matrix.o \ 
matrices/AA_matrix.o \ 
matrices/int_matrix.o \ 
matrices/str_matrix.o \ 
matrices/eigen.o \ 
incidere/slice_sampler.o \ 
dendrology/forestry.o \ 
dendrology/node.o \ 
dendrology/DNA_node.o \ 
dendrology/tree.o \ 
alphabetia/alphabet.o \ 
alphabetia/DNA_alphabet.o \ 
alphabetia/CODON_alphabet.o \ 
alphabetia/AA_alphabet.o 

CC = g++ 

INC=-I/home/jrm/tmp/proteus_beta 

.C.o: 
$(CC) $< -c $(INC) 

$(PROG): $(OBJS) 
$(CC) -o [email protected] $(OBJS) -lm 
+0

次回はコードをフォーマットしてください。 –

答えて

5

あなたのポストによると、あなたはmain.cppという名前のファイルではなく、main.Cという名前のファイルを持っています。しかし、.Cファイルを.oに変換する暗黙のルールを提供します。 makeは、.cpp.oコンパイルの組み込み規則を使用してmain.cppをコンパイルします。あなたがやりたいことには、2つのオプションがあります。

(1)(すなわち%.cpp: %.o、新しいスタイルのルールを使用することを検討してください).cpp.oにあなたの暗黙のルールを変更

は(2)自動的にCXXFLAGS変数を(宣言します

CXXFLAGS = $(INC) 

をして、あなたの.C.o暗黙のルールを削除します。次のような)メイクのC++のコンパイル暗黙のルールに含まれています。

2番目のオプションは、メイクファイルを簡略化し、拡張子に関係なくC++ファイルで動作します。

+0

すべてのソース拡張子は.cppと.hで終わりますが、.C.oルールはすべての.cppファイルを検索するようです。私はそれが特別な意味を持っていることを覚えていると思います(* .c * .cppと他のものを見つける)。しかし、私はあなたのアドバイスを受けて、提案2に従いました、そして、オブジェクトはすべて構築されます。どうもありがとうございました。 – jrm

0

ソースファイルは.Cまたは.cppで終わりますか?

.C.oリストルールの他の部分の後$(INC)用のコンパイルルールではなく、あなたは出力が来ることを期待:

あなたが表示されるはずです
CC = g++ 
INC = -I/home/jrm/tmp/proteus_beta 

.C.o: 
    $(CC) $< -c $(INC) 

を:

g++ file.C -c -I/home/jrm/tmp/proteus_beta 

しかし、それはに表示されますあなたのルールを完全に無視してください。あなたはmain.cppと言います。それは決してあなたのルールによって編集されません。

だから、.Cと認識されているサフィックスはありますか?あなたのソースファイルは.Cファイルですか?大文字と小文字を区別しないファイルシステムで実行していますか?なぜあなたはCコンパイラ(CC)を設定していますか?おそらくあなたのソースに問題があるでしょう。

+0

ご返信ありがとうございます。上記の私のコメントを参照してください。 – jrm

関連する問題