Как добавить флаг компиляции -g в файл make?

У меня есть программа на C ++, для которой кто-то другой создал файл make. Я хочу скомпилировать программу с флагом -g, но я не знаю, где ее добавить. Ниже приведен файл make.

CC = g++
LOADLIBES = -lm
CFLAGS = -Wall -O2


SRC1 = Agent.cpp Breeder.cpp CandidateSolution.cpp \
    Cupid.cpp FateAgent.cpp Grid.cpp Reaper.cpp \
    fitness.cpp

SRC2 = main.cpp

SRC  = $(SRC1) $(SRC2)

OBJS = $(SRC1:.cpp = .o)

AUX = $(SRC1:.c = .h)


main: $(OBJS) 
#   $(CC) $(CFLAGS) -o $(SRC) $(AUX) 

.PHONY: clean
clean:
    rm -f *.o main

Куда мне добавить, что я хочу использовать -g?

 John Dibling15 окт. 2012 г., 17:21
Этот вопрос о том, как использовать Makefile. В этом вопросе нет ничего о языке C ++. Вы используете make для сборки программы, написанной на C ++, но тот факт, что она написана на C ++, является ортогональным. Ваш код мог бы быть написан на Фортране.
 John Dibling15 окт. 2012 г., 17:11
Этот вопрос действительно не имеет ничего общего с C ++, поэтому я удалил тег [c ++]
 Niek de Klein15 окт. 2012 г., 17:19
По словам Робо, это
 Magnus20 мар. 2015 г., 14:08
@JohnDibling Я не согласен с тем, что C ++ ортогонален этому Makefile. Как показано в ответе, файлы Makefile имеют специальный синтаксис «встраивания», специфичный для C ++, и, таким образом, файлы Makefile имеют внутреннюю связь с C ++, в большей степени, чем FORTRAN, особенно при использовании этих специфических для C ++ флагов, как в OP.

Ответы на вопрос(2)

#   $(CC) $(CFLAGS) -o $(SRC) $(AUX) 

(убрать вздох хеша):

   $(CC) $(CFLAGS) -o $(SRC) $(AUX) 

И изменить

CFLAGS = -Wall -O2

в

CFLAGS = -Wall -O2 -g

Но вы можете найти отладку проще, если отключить оптимизацию, удалив-O2:

CFLAGS = -Wall -g
 Niek de Klein15 окт. 2012 г., 17:26
Это дает мне ошибку ld и удаляет Agent.cpp
Решение Вопроса

$ (CC) используется для компиляции программ на Си.. Аналогичным образом $ (CFLAGS) используется для программ на C, $ (CXXFLAGS) используется для компиляции C ++.

Измените первые несколько строк на это:

#CC = g++
LOADLIBES = -lm
CXXFLAGS = -Wall -O2 -g

(Но посмотрите заметки других людей о несовместимости между -O2 и -g.)

Избавьтесь от пробелов внутри скобок в этой строке:

OBJS = $(SRC1:.cpp=.o)

Изменитьmain Строки к этому:

main: $(OBJS) $(SRC2)
#   Built by implicit rules

Полученный make-файл должен выглядеть так:

#CC = g++
LOADLIBES = -lm
CXXFLAGS = -Wall -O2 -g


SRC1 = Agent.cpp Breeder.cpp CandidateSolution.cpp \
    Cupid.cpp FateAgent.cpp Grid.cpp Reaper.cpp \
    fitness.cpp

SRC2 = main.cpp

SRC  = $(SRC1) $(SRC2)

OBJS = $(SRC1:.cpp=.o)

AUX = $(SRC1:.c=.h)

main: $(OBJS) $(SRC2)
#   Built by implicit rules

.PHONY: clean
clean:
    rm -f *.o main

и вывод должен выглядеть так:

$ make
g++ -Wall -O2 -g   -c -o Agent.o Agent.cpp
g++ -Wall -O2 -g   -c -o Breeder.o Breeder.cpp
g++ -Wall -O2 -g   -c -o CandidateSolution.o CandidateSolution.cpp
g++ -Wall -O2 -g   -c -o Cupid.o Cupid.cpp
g++ -Wall -O2 -g   -c -o FateAgent.o FateAgent.cpp
g++ -Wall -O2 -g   -c -o Grid.o Grid.cpp
g++ -Wall -O2 -g   -c -o Reaper.o Reaper.cpp
g++ -Wall -O2 -g   -c -o fitness.o fitness.cpp
g++ -Wall -O2 -g    main.cpp Agent.o Breeder.o CandidateSolution.o Cupid.o FateAgent.o Grid.o Reaper.o fitness.o -lm  -o main

Для полноты, это версия make, которую я использую в Ubuntu 10.04:

$ make -v
GNU Make 3.81
Copyright (C) 2006  Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.

This program built for i486-pc-linux-gnu
 Robᵩ15 окт. 2012 г., 17:49
Первый символ в строке 23 должен быть символом TAB, а не рядом пробелов.
 Robᵩ15 окт. 2012 г., 17:43
Смотрите мое редактирование с фактическим make-файлом и фактическим выводом.
 Niek de Klein15 окт. 2012 г., 17:48
Makefile:23: *** missing separator. Stop. Я забыл упомянуть, что я использую MacGNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for i386-apple-darwin10.0
 Niek de Klein15 окт. 2012 г., 17:18
Что выводит#g++ -o Agent.cpp Breeder.cpp CandidateSolution.cpp Cupid.cpp FateAgent.cpp Grid.cpp Reaper.cpp fitness.cpp main.cpp Agent.cpp Breeder.cpp CandidateSolution.cpp Cupid.cpp FateAgent.cpp Grid.cpp Reaper.cpp fitness.cpp но не производит основной файл.

Ваш ответ на вопрос