makefile中的Cflags用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了makefile中的Cflags用法相关的知识,希望对你有一定的参考价值。
我想知道C FLAGS的使用。在make文件中,下面的代码片段是什么意思?
CFLAGS=-00 -g
${PROG}: ${OBJS}
${CC} ${CFLAGS} -o ${PROG} ${OBJS} ${LDFLAGS}
-00定义了什么?
############# Target type (Debug/Release) ##################
############################################################
TARGET_NAME=telematics
CFLAGS=-O0 -g
LinkDebug=-g -Xlinker -Map=$(TARGET_NAME)debug.map
LinkRelease=-O -s -Xlinker -Map=$(TARGET_NAME).map
SUPPRESS_WARNINGS=-Wno-write-strings -Wno-builtin-macro-redefined
COMMON_DEFINES = -DA5N2 -DLINUX_SYSTEM -DCT_2
C___DEFINES =
CPP_DEFINES = -std=c++11 -D_GLIBCXX_USE_C99 -DUSE_iosTREAM -DOM_NO_TEMPLATES_USAGE -DOM_NO_FRAMEWORK_MEMORY_MANAGER
ConfigurationCPPCompileSwitches= $(SUPPRESS_WARNINGS) $(COMMON_DEFINES) $(CPP_DEFINES) $(INCLUDE_PATH) $(CFLAGS) -c
ConfigurationCCompileSwitches= $(SUPPRESS_WARNINGS) $(COMMON_DEFINES) $(C___DEFINES) $(INCLUDE_PATH) $(CFLAGS) -c
###### Commands & Flags ################
RM=/bin/rm -rf
MD=/bin/mkdir -p
CC=arm-linux-gcc
LIB_CMD=arm-linux-ar
LINK_CMD=$(CC)
LIB_FLAGS=rvu
######### Context macros ##################
我的问题是基本了解-00是否用于静态分析?从make文件我认为它的-00(两个零)
您可能正在使用GCC作为您的C编译器(可能作为cross compiler),并且您的编译命令由make
运行。请阅读有关Invoking GCC的章节。 -O0
(最后是0
数字)是为了optimize option:
减少编译时间并使调试产生预期的结果。这是默认值
我强烈建议同时启用所有warnings
CFLAGS= -Wall -Wextra -O0 -g3
在你的Makefile
(如果你想要更多的optimizations,例如用于基准测试目的,用-O0
或-O2
替换-O3
)。 -g3
是一个debugging选项(为DWARF发出gdb
debugger调试信息,你应该使用它)。
请注意,-00
不适用于静态分析!您可以考虑使用专门的外部静态source analysis tools,如Frama-C或Clang Analyzer。这些工具通常比传统编译运行得慢得多(当然,任何编译器都在内部进行一些静态分析以进行优化)。
花时间阅读documentation of make
(可能还有binutils,链接器)。我不确定你想保持你的SUPPRESS_WARNINGS
线(它闻起来很糟糕)。您也许也可以使用remake(也是here)来调试你的Makefile
。请注意,GNU make
有许多内置规则,您可以使用make -p
查看并且应该使用。顺便说一句,CFLAGS
对于其中一些规则是已知的(因此在Makefile
-s中有关于为编译C文件而传递的编译标志的约定)。
请注意,您可能会非常谨慎和简约地在源代码中添加(很少)一些pragmas或function attributes,例如禁用特定警告或强制优化(仅限于一些非常少的函数)。
除了the answer by Basile Starynkevitch,我想补充一下:
在make文件中,下面的代码段是什么意思?
CFLAGS=-00 -g
上面分配-O0 -g
(使调试信息按预期工作,并分别添加调试信息)到CFLAGS
变量。
${PROG}: ${OBJS}
${CC} ${CFLAGS} -o ${PROG} ${OBJS} ${LDFLAGS}
上面为变量PROG
中命名的文件创建了一个编译配方,其中以变量OBJS
命名的文件作为先决条件。请注意,缩进使用TAB而不是空格。 (此论坛将标签转换为代码段中的空格,这就是为什么如果将上述内容复制+粘贴到编辑器中,则会获得空格。)
make解释的方法如下:首先,必须创建变量OBJS
中列出的所有文件(并且足够新)。然后,需要运行变量CC
中命名的命令,参数为${CFLAGS} -o ${PROG} ${OBJS} ${LDFLAGS}$
。
例如,如果CC=arm-linux-gcc
,PROG=foobar
,OBJS=foobar.o
和LDFLAGS=-lm
,然后生成foobar
,make需要首先确保foobar.o
存在并且足够新,然后运行arm-linux-gcc -o foobar foobar.o -lm
。
以上是关于makefile中的Cflags用法的主要内容,如果未能解决你的问题,请参考以下文章
makefile中ifeq,ifneq,ifdef和ifndef的区别与用法