Где поместить вещи (CFLAGS или CXXFLAGS) в Makefile? - PullRequest
0 голосов
/ 10 июня 2018

Сначала у Makefile было

CFLAGS   = -g -Wall -lm

, с которым я играл в то время C.Теперь я нахожусь на C++, и я должен добавить -I eigen, быстрый поиск в Google и обнаружил, что CXXFLAGS существует для мира C++, в то время как CFLAGS существует для мира C.Поэтому я обновил Makefile до

CFLAGS   = -g -Wall -lm
CXXFLAGS = -I eigen

Затем я нашел https://wiki.gentoo.org/wiki/GCC_optimization, и был вдохновлен, чтобы обновить его снова

CFLAGS   = -g -Wall -lm
CXXFLAGS = ${CFLAGS} -I eigen

Полная вещь:

CC       = g++
CFLAGS   = -g -Wall -lm
CXXFLAGS = ${CFLAGS} -I eigen
OBJS     = main.o multiply.o 
PROGRAM  = multitply
$(PROGRAM): $(OBJS)
    $(CC) $(OBJS) $(CFLAGS) -o $(PROGRAM)

Должен ли я добавить -I eigen к CXXFLAGS или CFLAGS?

Также заметил существование CPPFLAGS.

Должен ли я изменить на $(CC) $(OBJS) $(CXXFLAGS) $(CPPFLAGS) -o $(PROGRAM) или на $(CC) $(OBJS) -o $(PROGRAM)?

Должен ли я изменить на $(PROGRAM): $(OBJS) *.h, так чтовосстанавливает всякий раз, когда .h файлы получают изменения?

Есть ли другие улучшения?

1 Ответ

0 голосов
/ 10 июня 2018

Я бы использовал 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) в рецепте, вы можете просто использовать автоматические переменные $@ и $^, соответственно.

...