Fix it to use EXTRA_CFLAGS. Stop.

本文详细介绍了在Linux 2.6.34.1版本中遇到的编译提示错误如何通过替换CFLAGS为EXTRA_CFLAGS来解决。重点解释了EXTRA_变量的作用及其在不同KbuildMakefile中的使用方式,特别是$(EXTRA_CFLAGS)在$(CC)编译C源文件时作为选项的应用实例。
 

来源:http://blog.youkuaiyun.com/snow25bz/article/details/6282877

 

LDD3 :

1. 在linux2.6.34.1编译提示  Fix it to use EXTRA_CFLAGS.  Stop.

将makefile中的 CFLAGS 替换成 EXTRA_CFLAGS就可以了。

原因是在2.6的内核的版本中所有的 EXTRA_ 变量只在所定义的Kbuild Makefile中起作用。EXTRA_ 变量可    以在Kbuild Makefile中所有命令中使用。    $(EXTRA_CFLAGS) 是用 $(CC) 编译C源文件时的选项。    例子:          # drivers/sound/emu10kl/Makefile          EXTRA_CFLAGS += -I$(obj)          ifdef DEBUG              EXTRA_CFLAGS += -DEMU10KL_DEBUG          endif    该变量是必须的,因为顶层Makefile拥有变量 $(CFLAGS) 并用来作为整个源    代码树的编译选项。 

<think>我们有一个Makefile片段,用户想要在编译参数中添加EXTRA_CFLAGS。从片段中可以看出,已经有一行: EXTRA_CFLAGS += $(ZL38063_CFLAGS) 然后,我们观察到在构建目标all时,有一个make命令,它调用了内核构建系统(通过-C $(KLIB_BUILD))来构建ssl_port.o。在这个命令中,它通过CFLAGS_ssl_port.o来传递特定的编译选项(-I$(STAGING_DIR)/usr/include)。 目标:我们想要将EXTRA_CFLAGS(包括从上面添加的内容)也传递给这个内核模块的编译过程。 分析: 在Linux内核的Makefile中,编译内核模块时,我们可以通过EXTRA_CFLAGS来传递额外的编译选项。但是注意,在这个make命令中,我们是通过内建的规则来编译模块,并且已经使用了CFLAGS_<filename>.o来为特定文件设置标志。 然而,我们也可以使用通用的EXTRA_CFLAGS(或者在内核2.6及更高版本中,更常用的是ccflags-y)来传递额外的标志。 在这个Makefile中,我们正在调用内核的构建系统,并且使用M=$(LOCAL_PWD)指定模块的目录。因此,我们需要在该模块的Makefile(即当前目录的Makefile)中设置EXTRA_CFLAGS,或者在调用时传递。 但是,注意在当前的Makefile片段中,已经有了EXTRA_CFLAGS的定义,并且它是在当前Makefile中使用的吗?实际上,当前Makefile片段中,除了all目标下的命令,其他部分看起来像是定义变量和伪目标。 观察:在all目标中,我们调用了另一个make,它进入内核构建目录(KLIB_BUILD)并构建模块,模块的源代码在当前目录(LOCAL_PWD)。因此,我们需要确保在构建模块时,我们的EXTRA_CFLAGS被传递。 有两种方法: 方法1:在调用内核构建系统的命令中,通过命令行参数传递EXTRA_CFLAGS。但是注意,内核构建系统使用变量EXTRA_CFLAGS,所以我们可以这样做: $(MAKE) -C $(KLIB_BUILD) ... EXTRA_CFLAGS="$(EXTRA_CFLAGS)" 方法2:在模块的Makefile(即当前Makefile)中定义EXTRA_CFLAGS,因为当内核构建系统被调用时,它会读取当前目录(M指定的目录)的Makefile,并使用其中定义的变量。 但是,我们注意到当前Makefile片段中已经有了: EXTRA_CFLAGS += $(ZL38063_CFLAGS) 所以,我们实际上已经在当前Makefile中定义了EXTRA_CFLAGS。那么,在内核构建系统被调用时,这个变量会被读取并使用。 然而,我们还需要注意:在all目标的命令中,我们使用了CFLAGS_ssl_port.o来传递标志,这将会覆盖EXTRA_CFLAGS中为ssl_port.o设置的标志吗?不会,它们会合并。但是,如果同一个标志多次出现,可能会覆盖。不过,我们只是添加额外的标志,所以应该没问题。 但是,我们观察到在命令中已经传递了: CFLAGS_ssl_port.o="-I$(STAGING_DIR)/usr/include" 这也会被内核构建系统使用,并且会添加到ssl_port.o的编译选项中。 因此,我们当前的做法(定义EXTRA_CFLAGS)应该已经可以工作吗?因为在内核构建系统执行时,它会读取当前Makefile,所以EXTRA_CFLAGS已经被定义。 但是,用户可能是在问如何添加,也许当前并没有被正确传递?或者用户想要在命令行中增加? 再看Makefile片段,我们有一个目标all,它首先执行help,然后执行一个make命令。这个make命令中并没有传递EXTRA_CFLAGS,但是内核构建系统会自动读取当前Makefile中的变量,包括EXTRA_CFLAGS。所以,只要我们在当前Makefile中定义了EXTRA_CFLAGS,它就会被使用。 因此,如果我们想要添加更多的标志,可以直接在Makefile中追加EXTRA_CFLAGS,例如: EXTRA_CFLAGS += -DDEBUG 但是,如果用户想要在命令行中覆盖或添加,那么可以在执行make时传递: make EXTRA_CFLAGS="-DDEBUG" 这样,在Makefile中,EXTRA_CFLAGS就会包含这个值。 所以,总结:在当前的Makefile中,我们已经通过EXTRA_CFLAGS += $(ZL38063_CFLAGS)添加了标志,并且由于内核构建系统会读取这个Makefile,所以这些标志会被使用。如果还需要添加,可以继续在Makefile中追加,或者通过命令行传递。 但是,我们需要注意:在调用内核构建系统的那条命令中,我们并没有传递EXTRA_CFLAGS作为参数给make,而是通过当前Makefile的环境(因为调用make时,当前Makefile的变量会被传递给子make?)。实际上,在调用make时,如果不使用export,子进程不会自动继承变量。但是,在同一个Makefile中,我们调用的子make(即内核构建系统)会读取当前目录的Makefile(因为通过M指定),所以它会读取到当前Makefile中定义的EXTRA_CFLAGS。 所以,我们不需要修改命令,只需要确保在调用内核构建系统之前,EXTRA_CFLAGS已经被正确设置。 因此,在Makefile中,我们只需要在调用之前定义好EXTRA_CFLAGS。 但是,如果用户想要在编译时临时添加,可以在执行make时传递: make EXTRA_CFLAGS="额外的标志" 这样,在当前Makefile中,EXTRA_CFLAGS就会包含用户传递的值。 所以,回答:在编译参数中添加EXTRA_CFLAGS,只需要在Makefile中继续使用EXTRA_CFLAGS += ...,或者通过命令行传递。 但是,注意在Makefile片段中,我们有一个: obj-y := ssl_port.o lib-y := hal_port.o lib-y += ssl_port.o 这些是内核模块构建系统的变量,用于指定要构建的对象文件。而EXTRA_CFLAGS在内核构建系统中是一个标准变量,所以会被识别。 因此,无需修改编译命令,只要确保EXTRA_CFLAGSMakefile中正确设置即可。 如果用户想要在调用内核构建系统时显式传递,可以修改命令为: $(MAKE) -C $(KLIB_BUILD) CFLAGS_ssl_port.o="..." EXTRA_CFLAGS="$(EXTRA_CFLAGS)" ... 但是,这没有必要,因为内核构建系统会读取当前Makefile中的EXTRA_CFLAGS。 所以,我们得出结论:在当前的Makefile中继续使用EXTRA_CFLAGS变量即可。 但是,我们注意到在Makefile中,EXTRA_CFLAGS的定义是在顶层,所以会被读取。 因此,用户只需在Makefile中通过EXTRA_CFLAGS添加即可。 示例:在Makefile开头添加: EXTRA_CFLAGS += -I/path/to/include 或者,如果用户想要在命令行中临时添加,可以运行: make EXTRA_CFLAGS="-I/path/to/include" 这样,这些标志就会被添加到编译命令中。 注意:如果同时使用命令行和Makefile内部添加,那么它们会合并。 所以,回答用户:在编译参数中添加EXTRA_CFLAGS,只需要在Makefile中继续使用`EXTRA_CFLAGS += [你的标志]`,或者在执行make时通过命令行传入`EXTRA_CFLAGS="[你的标志]"`。 但是,用户可能是在问如何将EXTRA_CFLAGS传递给当前Makefile中的那个make命令(即构建ssl_port.o的命令)。实际上,那个命令是调用内核构建系统,而内核构建系统会自动读取当前Makefile(因为M=$(LOCAL_PWD)指定了模块目录)中的EXTRA_CFLAGS。所以,我们不需要在命令中显式传递。 因此,我们只需要确保在Makefile中定义了EXTRA_CFLAGS。 但是,我们注意到在Makefile片段中已经有了: EXTRA_CFLAGS += $(ZL38063_CFLAGS) 所以,用户只需在这个语句后面继续添加即可。 例如: EXTRA_CFLAGS += -Wall 这样,-Wall就会被添加到编译参数中。 结论:在Makefile中添加即可。 但是,如果用户想要在编译命令中看到这些标志,可以检查构建输出。 所以,我们给出建议:在Makefile中直接追加EXTRA_CFLAGS。 注意:如果ZL38063_CFLAGS变量中包含多个标志,那么它们都会被加入。 因此,回答完毕。 接下来,根据规则,我们需要在最后提出3-5个相关问题。 </think>### 分析如何在Makefile编译参数中添加`EXTRA_CFLAGS` #### 关键问题定位 1. **当前Makefile的局限性** 现有编译命令直接通过`CFLAGS_ssl_port.o`传递参数(如`-I$(STAGING_DIR)/usr/include`),但**未包含`EXTRA_CFLAGS`变量**: ```makefile $(MAKE) -C $(KLIB_BUILD) CFLAGS_ssl_port.o="-I..." ... # 缺失EXTRA_CFLAGS ``` 2. **`EXTRA_CFLAGS`的作用** 在Linux内核模块编译中,`EXTRA_CFLAGS`是标准变量,用于向所有目标文件追加编译选项(如`-D`宏定义、`-I`头文件路径等)。 --- #### 解决方案(二选一) ##### 方法1:修改模块构建命令(推荐) 在调用内核构建系统时显式传递`EXTRA_CFLAGS`: ```diff $(MAKE) -C $(KLIB_BUILD) \ CFLAGS_ssl_port.o="-I$(STAGING_DIR)/usr/include" \ + EXTRA_CFLAGS="$(EXTRA_CFLAGS)" \ # 新增此行 CC="$(KERNEL_CC)" M=$(LOCAL_PWD) ssl_port.o ``` - **效果**:将当前Makefile中定义的`EXTRA_CFLAGS`(含`$(ZL38063_CFLAGS)`)传递给内核编译系统。 ##### 方法2:直接注入到文件专属标志 将`EXTRA_CFLAGS`合并到`CFLAGS_ssl_port.o`: ```makefile CFLAGS_ssl_port.o += $(EXTRA_CFLAGS) # 在Makefile顶部添加 ``` ```diff $(MAKE) -C $(KLIB_BUILD) \ - CFLAGS_ssl_port.o="-I$(STAGING_DIR)/usr/include" \ + CFLAGS_ssl_port.o="-I$(STAGING_DIR)/usr/include $(EXTRA_CFLAGS)" \ CC="$(KERNEL_CC)" M=$(LOCAL_PWD) ssl_port.o ``` --- #### 修正后编译流程 ```mermaid graph LR A[make all] --> B[调用内核构建系统] B --> C[传递EXTRA_CFLAGS] C --> D[合并到ssl_port.o的编译选项] D --> E[正确包含所有自定义参数] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值