gcc部分

常用软件

名称

描述

cpp

C预处理器

gcc

C compiler

g++

C++ compiler

gcov

覆盖测试工具,用于分析在程序的哪个位置做优化效果最佳

libgcc

GCC 的运行库

libstdc++

标准 C++库

libsupc++

提供支持 C++语言的函数库

gcc的基本使用

gcc -o hello hello.c


显示详细编译过程

gcc -v hello.c


makefile与gcc的配合使用_json

将dir目录添加到头文件搜索目录列表

通过​​-I dir​​选项,在预编译过程中使用到

gcc –v hello.c -I /home/vmuser/hello


makefile与gcc的配合使用_动态库_02

连接库文件--libfoo.so

  1. 指定库文件目录,​​-Ldir​
  2. 指定库文件,​​-lfoo​
gcc hello.c -L /home/vmuser/hello -lfoo


定义带值的宏

在预处理阶段用到

CFLAGS += -DUART_DEBUG=Y


由动态库链接生成的程序,如何在别的电脑上运行

只需要将 ​​相关的动态库​​ 复制到目标系统的系统库文件路径如“/usr/lib”目录即可。

设置优化等级

gcc 优化等级由低到高分别是-O0, -O1, O2 和-O3。优化等级越高,编译时间会越长,这点在大工程编译时体现尤为明显。不同的优化等级,所产成的代码尺寸、执行效率方面也是不同的。

实际上还有一个在嵌入式系统中常用的优化等级-Os。 -Os 相当于-O2.5,使用了-O2 的优化部分选项,同时对代码尺寸进行优化。

加入调试信息

对于较大的程序,在开发过程中通常需要调试,以寻找和解决其中的 BUG。如果开启了优化选项,得到的代码是没有任何调试信息的,对于需要调试的程序,必须在编译的时候保留调试信息,关闭优化选项,打开“-g”调试选项。

打开调试信息后,代码尺寸会变大,如图 10.19 所示是 hello 的实例效果。

makefile与gcc的配合使用_源文件_03

程序开发完成并解决了 BUG 后,通常需要关闭调试选项,根据需要打开优化选项后进行测试和发布。

打开所有warning

-W


将所有警告转换为错误

-werror


创建静态库

ar -r libhello.a hello1.o hello2.o


创建动态库

共享库也是目标文件的集合,但这些文件是由编译器按照特殊方式生成的。对象模块的每个地址(函数调用和变量引用)都是相对地址,允许在运行时被动态加载和运行。

  1. 生成object
gcc -c -fpic hello1.c hello2.c


与创建静态库不同,这里加入了-fpic参数,表示生成的对象模块是可重定位的, pic表示位置独立代码(Position Independent Code)。

  1. 将object打包
gcc -shared hello1.o hello2.o -o libhello.so


或者直接一步到位

gcc -fpic -shared hello1.c hello2.c -o libhello.so


makefile部分

获取源文件

C_SRCS  := $(shell ls *.c)
C_SRCS += $(shell ls ../cJSON/*.c)


或者

C_SRCS  := $(wildcard *.c)
C_SRCS += $(wildcard ../cJSON/*.c)


由源文件名获得目标文件名

#将生成的目标文件放在与源文件相同目标下
OBJS = $(C_SRCS:.c=.o)


or

#采用通配符,将生成的目标文件放在与源文件相同目标下
OBJS = $(C_SRCS:%.c=%.o)


or

#将生成的目标文件放在BUILD_DIR目录中
OBJS =$(C_SRCS:%.c=$(BUILD_DIR)/%.o)


指定自定义头文件目录

INCS := -I.
INCS += -I../cJSON/


综合示例

点击查看代码

CPP      = g++
CC = gcc

TARGET := s2j_test.elf

# C_SRCS := $(shell ls *.c)
# C_SRCS += $(shell ls ../cJSON/*.c)

C_SRCS := $(wildcard *.c)
C_SRCS += $(wildcard ../cJSON/*.c)

OBJS := $(C_SRCS:%.c=%.o)

INCS := -I.
INCS += -I../cJSON/

CFLAGS = $(INCS) -std=c99

LIBS := -lm

LDFLAGS := $(LIBS)

.PHONY: all all-before all-after clean clean-custom

all:all-before $(OBJS)
$(CC) -o $(TARGET) $(OBJS) $(LDFLAGS)

OBJS:$(C_SRCS)
$(CC) $(CFLAGS) -c -o $(OBJS) $^

all-before:

all-before:

all-after:

clean-custom:

clean: clean-custom
-rm -f $(TARGET) $(OBJS)


输出效果

makefile与gcc的配合使用_源文件_04