在gnu make文件中包含被忽略的路径

时间:2011-01-21 01:03:17

标签: makefile 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”开头。

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

2 个答案:

答案 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) - 你的源代码可能有问题。