Включить игнорируемый путь в файл make gnu - PullRequest
2 голосов
/ 21 января 2011

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 ]

5 голосов
/ 21 января 2011

Согласно вашему сообщению, у вас есть файл с именем main.cpp, а не файл с именем main.C.Но вы предоставляете неявное правило для преобразования .C файлов в .o.Make скомпилирует main.cpp, используя свое встроенное правило для компиляции от .cpp до .o.У вас есть два варианта сделать то, что вы хотите:

(1) Измените ваше неявное правило на .cpp.o (и рассмотрите возможность использования правил нового стиля, например %.cpp: %.o)

(2)Объявите переменную CXXFLAGS (которая автоматически включается в неявное правило компиляции Make C ++), например:

CXXFLAGS = $(INC)

, а затем удалите неявное правило .C.o.

Второеопция упростит ваш make-файл и будет работать с файлами C ++ независимо от расширения.

0 голосов
/ 21 января 2011

Ваши исходные файлы заканчиваются на .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) - возможно, у вас проблемы с исходным кодом.

...