Я бы использовал CFLAGS
при компиляции файлов C и CXXFLAGS
при компиляции файлов C ++.Помимо CFLAGS
и CXXFLAGS
, возможно, здесь отсутствует другая релевантная переменная: CPPFLAGS
.
Должен ли я добавить -I eigen
к CXXFLAGS
или CFLAGS
?
CPPFLAGS
обычно используется для предоставления опций, связанных с препроцессором.Я бы использовал эту переменную для указания включаемых каталогов:
CPPFLAGS = -I eigen
Другая интересная переменная, которая полезна для предоставления библиотек, будет LDLIBS
.Вы можете воспользоваться этим для передачи -lm
:
LDLIBS = -lm
Должен ли я перейти на $(PROGRAM): $(OBJS) *.h
, поэтому он перестраивается всякий раз, когда .h
файлы получают изменения?
Подход, который я бы порекомендовал, заключается в добавлении предварительных условий для заголовочных файлов в соответствующие объектные файлы путем написания правил без рецепта, например:
main.o: main.h multiply.h ...
multiply.o: multiply.h ...
Кроме того, *
не подходитто, что вы ожидаете сделать, т.е. это не подстановочный знак в этом контексте.Поместите эти строки в конец файла Makefile, чтобы они не заменяли цель по умолчанию.
Файл Makefile может выглядеть примерно так:
CXXFLAGS = -g -Wall
CPPFLAGS = -I eigen
LDLIBS = -lm
OBJS = main.o multiply.o
PROGRAM = multitply
$(PROGRAM): $(OBJS)
$(CXX) $^ $(LDLIBS) -o $@
Нет необходимости повторять$(PROGRAM)
и $(OBJS)
в рецепте, вы можете просто использовать автоматические переменные $@
и $^
, соответственно.