如何配置我的 makefile 以进行调试和发布版本?
我的项目有以下 makefile,我想将其配置为发布和调试版本。 在我的代码中,我有很多 #ifdef DEBUG
宏,因此只需设置该宏并向编译器添加 -g3 -gdwarf2
标志即可。 我怎样才能做到这一点?
$(CC) = g++ -g3 -gdwarf2
$(cc) = gcc -g3 -gdwarf2
all: executable
executable: CommandParser.tab.o CommandParser.yy.o Command.o
g++ -g -o output CommandParser.yy.o CommandParser.tab.o Command.o -lfl
CommandParser.yy.o: CommandParser.l
flex -o CommandParser.yy.c CommandParser.l
gcc -g -c CommandParser.yy.c
CommandParser.tab.o: CommandParser.y
bison -d CommandParser.y
g++ -g -c CommandParser.tab.c
Command.o: Command.cpp
g++ -g -c Command.cpp
clean:
rm -f CommandParser.tab.* CommandParser.yy.* output *.o
只是为了澄清,当我说发布/调试构建时,我希望能够只输入 make
并获得发布构建或 make debug
并获得调试构建,而不需要手动注释掉 makefile 中的内容。
I have the following makefile for my project, and I'd like to configure it for release and debug builds. In my code, I have lots of #ifdef DEBUG
macros in place, so it's simply a matter of setting this macro and adding the -g3 -gdwarf2
flags to the compilers. How can I do this?
$(CC) = g++ -g3 -gdwarf2
$(cc) = gcc -g3 -gdwarf2
all: executable
executable: CommandParser.tab.o CommandParser.yy.o Command.o
g++ -g -o output CommandParser.yy.o CommandParser.tab.o Command.o -lfl
CommandParser.yy.o: CommandParser.l
flex -o CommandParser.yy.c CommandParser.l
gcc -g -c CommandParser.yy.c
CommandParser.tab.o: CommandParser.y
bison -d CommandParser.y
g++ -g -c CommandParser.tab.c
Command.o: Command.cpp
g++ -g -c Command.cpp
clean:
rm -f CommandParser.tab.* CommandParser.yy.* output *.o
Just to clarify, when I say release/debug builds, I want to be able to just type make
and get a release build or make debug
and get a debug build, without manually commenting out things in the makefile.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
您可以使用特定于目标的变量值。 示例:
请记住在所有编译命令中使用 $(CXX) 或 $(CC)。
然后,“make debug”将具有额外的标志,例如 -DDEBUG 和 -g,而“make”则不会。
顺便说一句,您可以像其他帖子所建议的那样使您的 Makefile 更加简洁。
You can use Target-specific Variable Values. Example:
Remember to use $(CXX) or $(CC) in all your compile commands.
Then, 'make debug' will have extra flags like -DDEBUG and -g where as 'make' will not.
On a side note, you can make your Makefile a lot more concise like other posts had suggested.
在搜索类似问题时经常出现这个问题,因此我认为有必要提供一个完全实施的解决方案。 特别是因为我(并且我认为其他人)一直在努力将所有不同的答案拼凑在一起。
下面是一个示例 Makefile,它支持单独目录中的多种构建类型。 所示示例显示了调试和发布版本。
支持...
This question has appeared often when searching for a similar problem, so I feel a fully implemented solution is warranted. Especially since I (and I would assume others) have struggled piecing all the various answers together.
Below is a sample Makefile which supports multiple build types in separate directories. The example illustrated shows debug and release builds.
Supports ...
如果通过配置发布/构建,您的意思是每个 makefile 只需要一个配置,那么这只是一个问题,并且将 CC 和 CFLAGS 解耦:
根据您是否可以使用 gnu makefile,您可以使用条件来使其更漂亮,并且从命令行控制:
然后使用:
如果需要同时控制两种配置,我认为最好有构建目录,以及一个构建目录 /config。
If by configure release/build, you mean you only need one config per makefile, then it is simply a matter and decoupling CC and CFLAGS:
Depending on whether you can use gnu makefile, you can use conditional to make this a bit fancier, and control it from the command line:
and then use:
If you need to control both configurations at the same time, I think it is better to have build directories, and one build directory / config.
请注意,您还可以使 Makefile 更简单,同时:
现在您不必到处重复文件名。 任何 .l 文件都将通过 flex 和 gcc 传递,任何 .y 文件将通过 bison 和 g++ 传递,任何 .cpp 文件仅通过 g++ 传递。
只需列出您期望最终得到的 .o 文件,Make 就会找出哪些规则可以满足需求...
记录如下:
$@
的名称目标文件(冒号之前的那个)$<
第一个(或唯一)必备文件的名称(冒号后的第一个)$^
所有必备文件的名称(空格分隔)$*
词干(与规则定义中的%
通配符匹配的位。Note that you can also make your Makefile simpler, at the same time:
Now you don't have to repeat filenames all over the place. Any .l files will get passed through flex and gcc, any .y files will get passed through bison and g++, and any .cpp files through just g++.
Just list the .o files you expect to end up with, and Make will do the work of figuring out which rules can satisfy the needs...
for the record:
$@
The name of the target file (the one before the colon)$<
The name of the first (or only) prerequisite file (the first one after the colon)$^
The names of all the prerequisite files (space separated)$*
The stem (the bit which matches the%
wildcard in the rule definition.你可以有一个变量
然后你可以使用条件语句
you can have a variable
then you can use a conditional statement
完成之前的答案...您需要引用您在命令中定义信息的变量...
Completing the answers from earlier... You need to reference the variables you define info in your commands...
您还可以向 Makefile 添加一些简单的内容,例如
然后编译它以进行调试
make DEBUG=1
You could also add something simple to your Makefile such as
Then compile it for debugging
make DEBUG=1