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-CClang Analyzer。这些工具通常比传统编译运行得慢得多(当然,任何编译器都在内部进行一些静态分析以进行优化)。

花时间阅读documentation of make(可能还有binutils,链接器)。我不确定你想保持你的SUPPRESS_WARNINGS线(它闻起来很糟糕)。您也许也可以使用remake(也是here)来调试你的Makefile。请注意,GNU make有许多内置规则,您可以使用make -p查看并且应该使用。顺便说一句,CFLAGS对于其中一些规则是已知的(因此在Makefile-s中有关于为编译C文件而传递的编译标志的约定)。

请注意,您可能会非常谨慎和简约地在源代码中添加(很少)一些pragmasfunction 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-gccPROG=foobarOBJS=foobar.oLDFLAGS=-lm,然后生成foobar,make需要首先确保foobar.o存在并且足够新,然后运行arm-linux-gcc -o foobar foobar.o -lm

以上是关于makefile中的Cflags用法的主要内容,如果未能解决你的问题,请参考以下文章

makefile中ifeq,ifneq,ifdef和ifndef的区别与用法

CFLAGS/CPPFLAGS/CXXFLAGS in Makefile介绍

Makefile语法不清楚

海思官方makefile源码的学习 3

海思官方makefile源码的学习 3

海思官方makefile源码的学习 3