使用 make 有条件地设置调试宏
在我的 C++ 项目中,我有一个约定,每当定义宏 DEBUG
时,调试 printf 式语句都会编译到可执行文件中。
为了表明我是否希望将它们编译到可执行文件中,我通常会使用 -D
macro 选项将宏名称传递给 gcc。因此,在 Makefile
我(当前)有:
CXXFLAGS += -g -I ../ -Wall -Werror -DDEBUG
但是,这不是很灵活;如果我不想在最终程序中包含调试语句,我必须修改 Makefile 以删除 -DDEBUG。
有没有办法修改 Makefile,以便我可以通过传入另一个目标名称或命令行开关来有条件地选择是否在编译时使用 CXXFLAGS 中的 -D 进行编译?不知道我该怎么做。
In my C++ project, I have a convention where whenever the macro DEBUG
is defined, debugging printf-esque statements are compiled into the executable.
To indicate whether or not I want these compiled into the executable, I normally would pass the macro name to gcc with the -D
macro option. So, in the Makefile
I (currently) have:
CXXFLAGS += -g -I ../ -Wall -Werror -DDEBUG
However, this is not very flexible; if I didn't want debug statements in my final program, I'd have to modify the Makefile to remove the -DDEBUG.
Is there a way to modify the Makefile
such that I can conditionally select whether to compile with -D in the CXXFLAGS at compile time by passing in, say, another target name or a commandline switch? Not sure how'd I go about doing that.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您可以根据 makefile 中的目标有条件地定义其他变量。
所以现在:
You can conditionally define other variables based on the target in the makefile.
So now:
附加您可以从 CLI 或环境设置的另一个变量
Append another variable that you can set from the CLI or environment
考虑一下这个:
http://users.softlab.ece.ntua.gr/~ttsiod/ makefile.html
Consider this one:
http://users.softlab.ece.ntua.gr/~ttsiod/makefile.html
在思考 make 文档之后,我尝试将这在我的 Makefile 中:
然后,当您运行
make -d
时,-DDEBUG
被设置。现在,请注意,它可以工作,但我必须使用 make 通常接受的普通标志(你不能自己制作)。使用 -d 还会将(无害的)详细的 make 级调试语句显示到屏幕上。这是我真的不想要的;它掩盖了编译错误。但它确实有效。
我希望有人能想出更好的主意。
After meditating upon the make documentation, I tried putting this in my Makefile:
Then, when you run
make -d
,-DDEBUG
is set.Now, mind you, it works, but I had to use a normal flag that make usually accepts (you can't make up your own). Using -d also spews (harmless) verbose make-level debugging statements to the screen. Which I really don't want; it obscures compile errors. But it does work.
I hope someone can come up with a better idea.