Makefile 中的 Cflags 用法

标签 c makefile

我想知道 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其中:

reduce compilation time and make debugging produce the expected results. This is the default

我强烈建议同时启用所有 warnings所以放

CFLAGS= -Wall -Wextra -O0 -g3

在您的 Makefile 中(如果您想要更多 optimizations ,例如为了基准测试目的,将 -O0 替换为 -O2-O3). -g3debugging选项(为 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在您的源代码中,例如禁用特定警告或强制优化(仅针对极少数函数)。

关于Makefile 中的 Cflags 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49063617/

相关文章:

path - 如何将交叉编译器添加到PATH

makefile - 在 Makefile 中保存生成进程的 PID

c++ - 如何在 Mac OSX 上编译 OpenCV + CUDA(我试过 cmake 和一个 makefile)?

c - 制作 : flex: Command not found

c - 如何在我的实现 QuickSort 中防止堆栈溢出?

C - Makefile 在头文件更改后编译,但更改不生效

c - 在 C 中,malloc(256) 和 malloc(sizeof(char)*256) 等价吗?

c - 如何在 C 中的 bool 表达式中计算不同长度的数组?

c - 该行有多个标记错误

php - PHP 使用什么子字符串算法(查找字符串)?