gcc概述
GUN计划提供编译器(unix cc编译器)编译工具链g++ ld ldfd 交叉编译工具链
什么叫交叉编译
A\源文件到可执行文件经历哪几个步骤 (预处理 编译 汇编 链接)
B\预处理的任务:头文件展开#include,宏替换#define,条件编译(#开头的代码)
C\编译的任务:检查语法,生成汇编文件.s
D\汇编阶段:编译汇编文件,生成目标文件.o
E\链接的任务:链接所有目标文件,生成符号表,生成可执行文件
宿主机 交叉编译 目标机
交叉编译器
交叉编译:在宿主机下编译出在目标机下运行的代码的过程
在当前CPU平台下编译出在其他CPU平台运行的代码的过程
简单理解为不兼容
编译选项
-o(可执行重命名:elf格式)
ELF文件是一种用于二进制文件、可执行文件、目标代码、共享库和core转存格式文件
-E(只进行预处理)-l (指定头文件的第三方搜索路径)
-S(进行编译阶段)-c(进行汇编阶段)
搜索路径不同
<>在系统头文件目录搜索/usr/include 若没有就报错
“”现在当前目录查找,若没有,再到系统头文件目录查找,若没有在报错
//规范<>包含系统头文件,“”包含自定义头文件
.h声明 .c定义
在.c里面写
现在头文件在其他目录里面用-I指定/相对路径
编译优化
-O1:优化会消耗少多的编译时间,它主要对代码的分支,常量以及表达式等进行优化。
-O和-O1: 对程序做部分编译优化,对于大函数,优化编译占用稍微多的时间和相当大的内存。使用本项优化,编译器会尝试减小生成代码的尺寸,以及缩短执行时间,但并不执行需要占用大量编译时间的优化。
O2:会尝试更多的寄存器级的优化以及指令级的优化,它会在编译期间占用更多的内存
-O3: 在O2的基础上进行更多的优化
gcc -wall demo.c -o demo //开全部警告
比如: gcc-Wall -o3 demo.c -o demo
嵌入式Linux开发工具
1.编译器gcc(静态库和动态库的制作和使用)
2.调试gdb(常用命令,调用内存错误)
3.工程管理器make(makefile编写,多目录的makefile的编写)
4.//库函数(保存在库文件里面)printf scanf strcpy strcat
库文件:保存函数和变量,里面的函数和变量只能使用,但是看不到其实现
库文件的分类:静态库.a 保存的函数和变量,在编译阶段加载到可执行文件中
动态库.so:保存的函数和变量,在执行阶段加载到可执行文件中
使用静态库和动态库的区别(生成可执行文件的区别)
1.使用静态库编译出来的可执行文件大小>使用静态库编译出来的可执行文件大小(内存的开销
2.使用静态库编译出来的可执行文件执行速度>使用动态库编译出来的可执行文件执行速度
3.使用静态库编译出来的执行文件不易升级
4.使用静态库编译出来的执行文件程序部署>使用动态库编译出来的可执行文件程序
//库文件的存放路径 系统运行所需要的库文件:lib(库) 第三方软件和工具运行所需要的库:/usr/lib
//编译时,编译器会自动到这两个目录里找到所需要链接的库文件cp libadd.a /usr/lib
制作静态库:
1.将目标源文件编译成目标文件;gcc -c 目标源文件(gcc -c add.c)
2.使用ar工具制作静态;ar -rcs(库不存在就创建,存在就更新) 所要生成的库文件的名字(lib+库名+后缀.a) 目标文件
ar -rcs libadd.a add.o sub.o//有多少就跟在后面
生成libadd.a的静态库
制作一个add函数库
主函数:#include <stdio.h>
#include “add.h”
int main(int argc,char *arrrgv[])
{
printf(“add=%d\n”,add(5,6));
return 0;
}
add.c:int add(int a,int b)
{
return a+b;
}
add.h: extern int add(int a,int b);
gcc -c add.c 生成目标文件.o
ar -rcs libadd.a add.o 生成add库
制作
静态库使用:
使用静态库:
之前通常编译是gcc demo.c add.c -o add
以后就直接用libadd为了卖给人家,也让人家不需要知道里面的代码
gcc demo.c -ladd
gcc 源文件 -l库名 -L库存放的路径
gcc -l:指定加载哪个静态库
-L:指定加载的库文件的存放路径
gcc demo.c -ladd -L./lib //调add库
如果你的库报错 can find -ladd
collect 2:error:ld returned 1 exit
你要 cp libadd.a/usr/lib
因为
//库文件的存放路径 系统运行所需要的库文件:lib(库) 第三方软件和工具运行所需要的库:/usr/lib
//编译时,编译器会自动到这两个目录里找到所需要链接的库文件cp libadd.a /usr/lib
cp libadd.a/lib
或者你可以用demo.c -ladd -L/root/205/1107/lib
动态库的创建:
gcc -shared-fPIC-o库名.so源文件.c
动态库的使用:
gcc 源文件.c./库名.so-o可执行文件名
动态库一定要考到libcal.so /usr/lib
gcc -shared -fPIC -o libcal.so add.c sub.c div.c mul.c
1.gcc demo.c ./libcal.so -o demo //一定要指定路径
./a.out
3.cp libcal.so/usr/lib
gcc main.c -o main -lcal
./main