gcc参数介绍及makefile的使用介绍

----参考网络整理

1、gcc常用的几个参数

-o   指定可执行程序的名称                                                                                                                 //gcc -o main main.o----->main.o链接为main这一可执行程序

-c   只要求编译器输出目标代码,而不用生成可执行程序(即:只编译,不链接,只生成 .o文件)//gcc -c main.c------>生成 main.o

-g   要求编译器在编译的时候提供我们以后对程序进行调试的信息 

-Wall 允许发出gcc所有有用的报警信息

2、gcc包含的库路径及库文件

对于一些标准库来说,我们没有必要指出路径。只要它们在起缺省库的路径下就可以了。系统的缺省库的路径/lib /usr/lib /usr/local/lib 在这三个路径下面的库,我们可以不指定路径。

其余的库,需要我们指定路径和库名

-l库名           //小写的L //   gcc -o temp temp.c -lm     //使用了数学函数,添加m库。

-L库路径     //大写的L  // -L/home/hoyt/mylib    

gcc -o temp temp.c  -L/home/hoyt/mylib   -lmytest

注意:库路径和库名是分开的,都要添加。

3、gcc中包含头文件

INCLUDES      =-I./include 
INCLUDES   +=-I./myinclude

 

3、makefile常用的变量及通配符

$@   目标文件

$^    所有依赖文件

$<  表示第一个依赖文件     //第一个依赖文件是.c文件。
$?  表示比目标还要新的依赖文件列表

  • 通配符符号:%

举例:

main:main.o mytool1.o mytool2.o

gcc -o $@ $^

main.o:main.c mytool1.h mytool2.h

gcc -c $<

4、链接 

$(TARGET):$(OBJ)
	@mkdir -p output
	$(CC) $(OBJ) $(INCLUDES) $(LIB_PATH) $(LIB_NAMES) -g -o output/$(TARGET)$(VERSION) -std=c++11

 //我们发现:最终生成的可执行文件为target加了版本号的,也就是说虽然 TARGET,最终是以-o为最终结果。

 5、makefile中所有的.c编译成.o文件 %.o:%.c

%.o  是指以.o结尾,当然这里也可以使用通配符*,只不过%多用于Makefile。

//作用:将后缀为.c的文件都编译成同名的.o文件

CC			=/usr/local/arm/arm-zynq-v6.2.1/bin/arm-linux-gnueabihf-g++
DEBUG 		=-DUSE_DEBUG
CFLAGS		=-Wall

%.o:%.c
    $(CC) $(INCLUDES) $(DEBUG) -c $(CFLAGS) -std=c++11 $< -o $@

 

6、makefile常用函数

1)获取匹配模式文件名函数— wildcard


“PATTERN”使用 shell可识别的通配符,包括“ ?”(单字符)、“*”(多字符)等

语法:$(wildcard PATTERN)
函数功能:列出当前目录下所有符合模式“ PATTERN”格式的文件名。
返回值:空格分割的、存在当前目录下的所有符合模式“ PATTERN”的文件名。
 

CFILES = $(wildcard *.c)  //变量CFILES 赋值为所有以.c结尾的文件。//返回的文件以空格分隔开显示的。

2)模式替换函数— patsubst 


参数 “TEXT ”单词之间的多个空格在处理时被合并为一个空格,并忽略前导和结尾空格。

语法:$(patsubst PATTERN,REPLACEMENT,TEXT)
函数功能:搜索“ TEXT”中以空格分开的单词,将否符合模式“ TATTERN ”替换为“REPLACEMENT ”。参数“PATTERN”中可以使用模式通配符 “%”来代表一个单词中的若干字符。 如果参数“REPLACEMENT ”中也包含一个“%”,那么“ REPLACEMENT ”中的“ %”将是“ TATTERN”中的那个“ %”所代表的字符串。在“ TATTERN ”和“REPLACEMENT ”中,只有第一个“ %”被作为模式字符来处理,之后出现的不再作模式字符(作为一个字符)。在参数中如果需要将第一个出现的“ %”作为字符本身而不作为模式字符时,可使用反斜杠“ ”进行转义处理(转义处理的机制和使用静态模式的转义一致,
返回值:替换后的新字符串。
FILE = A.c  B.c

FILE1 = $(patsubst %.c,%.f,$(FILE))    //把FILE变量中的以.c结尾的文件替换.c替换成.f

@echo  FILE1= $(FILE1)

 

7、命令前添加@,只显示命令结果,不显示命令

1)@echo $(A)    //打印出变量A的值,但是不显示命令 ,@的作用。

2)@mkdir - p output   //创建output文件

8、-std=c++11

This mode can be selected with the -std=c++11 command-line flag, or -std=gnu++11 to enable GNU extensions as well.

-std=c++11,支持C++11标准;

-std=gnu++11,支持C++11标准和GNU扩展特性;
 

9、makefile默认的变量

CC = gcc

CFLAGS = -g

默认变量CC 就是gcc,即使我们此处不赋值,使用时,直接用$(CC)也是可以使用的。

CFLAGS为默认的gcc编译参数变量。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 在使用gcc编译stm32时,我们通常会使用stm32标准库。标准库是一系列的函数和头文件,可以方便地操作stm32的各种硬件资源。 在编写程序时,为了方便地管理代码和编译,我们常常会使用makefile来构建项目。makefile是一个包含了一系列规则的文本文件,规定了如何编译程序和生成可执行文件。 在使用gcc和stm32标准库时,我们需要在makefile中进行一些配置和设置。首先,我们需要指定编译器为gcc,可以使用`CC = gcc`来定义编译器变量。接下来,我们需要设置编译选项,例如指定目标芯片型号、编译的优化级别等。可以使用`CFLAGS = -mcpu=cortex-m3 -mthumb -Os`来设置。 在项目中,我们还需要指定头文件搜索路径和库文件路径。由于stm32标准库可能需要包含较多的头文件和库文件,我们可以使用`INCLUDES = -I./inc`来指定头文件搜索路径,`LIBS = -L./lib`来指定库文件路径。 在makefile中,我们还需要定义编译规则,包括编译和链接。例如,我们可以使用以下规则来编译源文件并生成可执行文件: ``` main.elf: main.o stm32_startup.o $(CC) $(CFLAGS) $(INCLUDES) $(LIBS) -o main.elf main.o stm32_startup.o ``` 这个规则表示,要生成main.elf可执行文件,需要先编译main.o和stm32_startup.o两个目标文件,然后使用gcc进行链接并生成可执行文件。$(CC)表示使用的编译器,$(CFLAGS)表示编译选项,$(INCLUDES)表示头文件搜索路径,$(LIBS)表示库文件路径。 最后,我们还可以定义一些其他的规则,例如清除中间文件、烧录目标等。 总之,通过编写适当的makefile,我们可以方便地使用gcc编译stm32的程序,并使用stm32标准库来操作硬件资源。 ### 回答2: gcc是一种常用的编译器,而STM32则是一系列基于ARM Cortex-M内核的单片机产品。当我们在开发STM32项目时,通常会使用gcc编译器,同时也需要使用到STM32的标准库。那么如何在项目中正确地使用gcc编译器和STM32标准库呢?这就需要借助makefile来完成。 makefile是一种文本文件,其中定义了编译、链接和构建项目所需的规则。在使用gcc编译器和STM32标准库时,我们可以通过makefile来自动化地管理编译过程,提高效率。 首先,我们需要在makefile中定义编译器的路径及参数。可以使用gcc命令行选项来指定编译器的路径,并使用-D参数定义一些预处理宏,以支持不同的编译选项和功能。 接下来,我们需要定义源文件和目标文件的依赖关系,以及编译和链接的规则。通过在makefile中明确规定依赖关系,可以确保在进行编译和链接时,只对修改过的文件进行重新编译和链接操作,提高编译速度。 在构建STM32项目时,我们还需要包含STM32的标准库头文件,并链接对应的库文件。可以通过在makefile中设置INCLUDES和LIBS变量来指定相应的路径。 最后,在makefile中定义一个默认的目标(all),来指定编译和链接的规则。当我们执行make命令时,makefile会自动根据定义的规则来执行编译和链接操作,生成最终的可执行文件。 总的来说,通过使用gcc编译器和STM32标准库,并结合makefile的自动化管理功能,可以更方便地进行STM32项目的开发和构建,提高效率和代码质量。 ### 回答3: gcc是一种开源的C语言编译器,可用于编译嵌入式系统中的代码。stm32是一系列由STMicroelectronics公司生产的32位ARM Cortex-M微控制器。标准库是一组常用函数和宏定义的集合,可用于简化程序的开发。 在使用gcc编译stm32程序时,需要编写一个makefile文件来指示编译器如何编译和链接代码。makefile文件是一个文本文件,其中包含了一系列规则和命令,用于描述编译过程中的依赖关系和操作指令。 在makefile中,我们需要为编译器提供必要的编译选项,以指示编译器使用正确的指令集和连接器脚本。我们还需要指定源代码文件的路径和依赖关系,以确保所有依赖的文件都被正确编译和链接。 在编译stm32程序时,我们通常需要借助于STM32Cube软件包提供的HAL(硬件抽象层)库和CMSIS(Cortex Microcontroller Software Interface Standard)库。在makefile中,我们需要将这些库的路径添加到编译器的搜索路径中,以确保编译器能够找到并正确链接这些库。 除了库的路径配置外,我们还可以在makefile中定义一些宏,用于指示编译器启用或禁用某些功能。例如,我们可以定义宏来启用调试输出、优化代码或配置硬件引脚。 总之,通过编写一个适当的makefile文件,我们可以使用gcc编译stm32程序,并包含所需的库和宏定义。这样可以大大简化程序的开发过程,提高代码的可维护性和可重用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值