在gnu make文件中忽略包含路径
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
根据您的文章,您有一个名为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++文件一起工作,无论扩展名如何。
所有源扩展名以.cpp和.h结尾,但.C.o规则似乎找不到所有.cpp文件。我想我记得它有一个特殊的含义(发现* .c * .cpp和其他一些)。但是,我确实接受了您的建议并遵循了建议2,现在所有对象都在建立。非常感谢你。 – jrm 2011-01-21 04:21:50
请对源文件结束与.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) - 你的源代码可能有问题。
感谢您的回复。看到我上面的评论。 – jrm 2011-01-21 04:23:13
下次请格式化您的代码。 – 2011-01-21 01:05:30