【问题标题】:How to add compile flag -g to a make file?如何将编译标志 -g 添加到 make 文件中?
【发布时间】:2012-10-15 14:55:33
【问题描述】:

我有一个 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 的内容?

【问题讨论】:

  • 这个问题真的和C++无关,所以我去掉了[c++]标签
  • 这个问题是关于如何使用 Makefile。这个问题中没有关于 C++ 语言的内容。您碰巧正在使用 make 构建一个用 C++ 编写的程序,但它是用 C++ 编写的这一事实是正交的。您的代码也可能是用 FORTRAN 编写的。
  • @JohnDibling 我不同意 C++ 与这个 Makefile 正交。正如答案所证明的那样,Makefiles 具有特定于 C++ 的特殊“内置”语法,因此 Makefiles 确实与 C++ 有内在关系,比 FORTRAN 更重要,特别是在像 OP 那样使用这些 C++ 特定标志时。跨度>

标签: c++ makefile


【解决方案1】:

$(CC) 用于编译 C 程序。 $(CXX) 用于编译 C++ 程序。类似地,$(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

生成的 makefile 应该如下所示:

#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

为了完整起见,这是我在 Ubuntu 10.04 上使用的 make 版本:

$ 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

【讨论】:

  • 输出#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,但不生成主文件。
  • Makefile:23: *** missing separator. Stop. 我忘了说我用的是 Mac 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 i386-apple-darwin10.0
  • 第 23 行的第一个字符必须是 TAB,而不是一系列空格。
【解决方案2】:

您需要取消注释该行:

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

(去掉哈希叹息):

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

然后改变

CFLAGS = -Wall -O2

CFLAGS = -Wall -O2 -g

但如果您通过删除 -O2 禁用优化,您可能会发现调试更容易:

CFLAGS = -Wall -g

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多