编译器gcc 静态库,动态库的制作

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱技术的小曹

你的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值