2011-01-21 93 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