【问题标题】:Cflags usage in makefilemakefile 中的 Cflags 用法
【发布时间】:2018-03-02 06:06:34
【问题描述】:

我想知道C FLAGS的使用。在make文件中下面的sn-p是什么意思?

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(两个零)

【问题讨论】:

  • makefiles CFLAGS的可能重复
  • 我很确定它是 -O0 而不是 -00(第一个零实际上是字母 O)。阅读man gcc-O0 Reduce compilation time and make debugging produce the expected results. This is the default.。你能发布完整的 Makefile 吗?
  • 请查看更新数据中的makefile
  • 你是对的 -o0 。从手册页中,它说它减少了编译时间。所以它与 cpp 检查之类的静态分析无关?

标签: c makefile


【解决方案1】:

您可能正在使用GCC 作为您的C 编译器(可能是cross compiler),并且您的编译命令由make 运行。所以请阅读关于Invoking GCC 的章节。 -O0(最后是 0 数字)用于 optimize option 其中:

减少编译时间并使调试产生预期的结果。这是默认的

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

CFLAGS= -Wall -Wextra -O0 -g3

在您的Makefile 中(如果您想要更多optimizations,例如用于基准测试,请将-O0 替换为-O2-O3)。 -g3 是一个debugging 选项(用于为gdb debugger 发出DWARF 调试信息,您应该使用它)。

注意-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,例如禁用特定警告或强制优化(仅在极少数函数上)。

【讨论】:

  • CFLAGS 与 GCC 无关,它是 make(1) 在调用 C 编译器时默认使用的一组选项,无论是 GCC、PCC、CLANG 还是其他......有 LDFLAGS、YFLAGS、LFLAGS、FFLAGS、PFLAGS,用于调用ld(1)yacc(1)lex(1)f77(1)pc(1)
  • 我写过CFLAGS和GCC有关吗?
  • 好吧,你开始说 你可能会使用 GCC 并且没有提及 CFLAGS 的任何内容,这是 make(1) 行话中的标准......你推荐编译时使用的 C 选项,但不要谈论 make(1) 如何执行默认构建命令。这是你的答案,没有更多的 cmets (-;
  • 我写道,OP 必须阅读 make 的文档。我没有时间(或空间)来解释 make。 OP应该自学
  • 但是问题 itsels 指出:Makefile 中的 Cflags 用法,所以,或者你误解了这个问题,或者这里发生了错误:)
【解决方案2】:

除了the answer by Basile Starynkevitch,我想补充一下:

在make文件中下面的sn-p是什么意思?

CFLAGS=-00 -g

上面将-O0 -g(使调试信息按预期工作,并分别添加调试信息)分配给CFLAGS变量。

${PROG}: ${OBJS}
        ${CC} ${CFLAGS} -o ${PROG} ${OBJS} ${LDFLAGS}

上面为变量PROG中命名的文件创建了一个编译配方,变量OBJS中命名的文件作为先决条件。请注意,缩进使用 TAB,而不是空格。 (本论坛在代码 sn-ps 中将制表符转换为空格,这就是为什么如果将上面的内容复制并粘贴到编辑器中会出现空格。)

make 对此的解释如下:首先,必须创建变量OBJS 中列出的所有文件(并且足够新)。然后,需要运行变量CC中命名的命令,参数${CFLAGS} -o ${PROG} ${OBJS} ${LDFLAGS}$

例如CC=arm-linux-gccPROG=foobarOBJS=foobar.oLDFLAGS=-lm,那么要生成foobar,make需要先保证foobar.o存在且足够新,然后运行@987654337 @。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多