makefile包含在下面。它只是一个很长的目标文件列表和两个目标。问题似乎是第一个目标忽略了$(INC)。例如,输出以“g ++ -c -o main.o main.cpp”而不是“g ++ -I / usr / home / jrm / tmp / proteus_beta -c -o main.o main.cpp”开头。
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 $@ $(OBJS) -lm
答案 0 :(得分:5)
根据您的帖子,您有一个名为main.cpp
的文件,而不是名为main.C
的文件。但是,您提供了将.C
文件转换为.o
的隐式规则。 Make将使用其main.cpp
到.cpp
编译的内置规则编译.o
。您有两种选择可以做您想做的事情:
(1)将隐式规则更改为.cpp.o
(并考虑使用新式规则,即%.cpp: %.o
)
(2)声明一个CXXFLAGS
变量(自动包含在Make的C ++编译隐式规则中),如下所示:
CXXFLAGS = $(INC)
然后删除您的.C.o
隐式规则。
第二个选项将简化您的makefile,它将与C ++文件一起使用,无论扩展名如何。
答案 1 :(得分: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) - 你的源代码可能有问题。