常用软件
名称 | 描述 |
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
将dir目录添加到头文件搜索目录列表
通过-I dir
选项,在预编译过程中使用到
gcc –v hello.c -I /home/vmuser/hello
连接库文件--libfoo.so
- 指定库文件目录,
-Ldir
- 指定库文件,
-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 的实例效果。
程序开发完成并解决了 BUG 后,通常需要关闭调试选项,根据需要打开优化选项后进行测试和发布。
打开所有warning
-W
将所有警告转换为错误
-werror
创建静态库
ar -r libhello.a hello1.o hello2.o
创建动态库
共享库也是目标文件的集合,但这些文件是由编译器按照特殊方式生成的。对象模块的每个地址(函数调用和变量引用)都是相对地址,允许在运行时被动态加载和运行。
- 生成object
gcc -c -fpic hello1.c hello2.c
与创建静态库不同,这里加入了-fpic参数,表示生成的对象模块是可重定位的, pic表示位置独立代码(Position Independent Code)。
- 将object打包
gcc -shared hello1.o hello2.o -o libhello.so
或者直接一步到位
gcc -fpic -shared hello1.c hello2.c -o libhello.so
获取源文件
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)
输出效果