2011-01-21 100 views
2

makefile包含在下面。這只是一個很長的目標文件和兩個目標列表。問題似乎是,第一個目標被忽略了$(INC)。例如,輸出以「g ++ -c -o main.o main.cpp」而不是「g ++ -I/usr/home/jrm/tmp/proteus_beta -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

下次請格式化您的代碼。 – 2011-01-21 01:05:30

回答

5

根據您的文章,您有一個名爲main.cpp文件,而不是一個名爲main.C文件。但是,您提供了將.C文件轉換爲.o的隱含規則。 Make將使用.cpp.o編譯的內置規則編譯main.cpp。你有兩個選擇,做你想做什麼:

(1)改變你的隱規則.cpp.o(並考慮使用新型的規則,即%.cpp: %.o

(2)聲明一個CXXFLAGS變量(自動爲包括在製作的C++編譯隱含規則),如下列:

CXXFLAGS = $(INC) 

,然後刪除您.C.o隱含規則。

第二個選項將簡化您的makefile,它將與C++文件一起工作,無論擴展名如何。

+0

所有源擴展名以.cpp和.h結尾,但.C.o規則似乎找不到所有.cpp文件。我想我記得它有一個特殊的含義(發現* .c * .cpp和其他一些)。但是,我確實接受了您的建議並遵循了建議2,現在所有對象都在建立。非常感謝你。 – jrm 2011-01-21 04:21:50

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 2011-01-21 04:23:13