软件最原始的安装方法 用tarball来安装升级
make命令
执行make ,会在当前路径下搜索makefile这个文本文件,这个文件中记录了源码如何编译的详细信息。
软件开发商通常会写一个检测程序,检测用户的操作系统环境,以及是否有编译过程的所需要的功能,比如需要的各种库,
检测完毕后,会主动新建makefile。检测程序就是configure或config,这其实是个shell脚本。

编译过程
1 执行configure脚本,这个脚本会去检测编译器,需要的函数库和其他资源,执行成功,生成makefile
2 make
注意:不同平台编译后的二进制程序放到其他平台可能不能执行成功。应为不同平台的函数库路径可能不同。所以需要需要重新编译,这一点不像windows那么方便了。

Tallball文件,就是将所有源码打成tar包,然后进行压缩。当然用的最多的压缩就是gzip压缩
本质就是软件的各种源码

软件更新
什么情况会要软件更新,或者说升级?
更新方式:
编译源码更新
直接以二进制程序安装更新 rpm yum

写makefile文件就得熟悉gcc的参数
编译其实是分四个阶段进行的
1 预处理 gcc -E test.c -o test.i 得到预处理后的文件.i,处理文件包含,宏定义
2 编译 gcc -S test.i -o test.s 得到汇编代码
3 汇编 gcc -c test.c -o test.o 得到目标文件
4 链接 gcc test.o -o test 将目标文件和附加所需要的目标文件链接起来,生成二进制

这是对一个程序文件,对多个源文件组成的,对每个文件过程是一样的。
有多个文件组成时,t1.c t2.c t3.c
如何编译最好?
先编译成目标文件,然后再用目标链接生成二进制文件。为什么这么做?
每个目标文件是一个模块,如果只修改了一个文件,只要重新编译这一个文件为目标文件,最后链接一下就好了,其他的模块完全不用动。
gcc -c test.c test2.c test3.c --> test.o test2.o test3.o
如果有十几个文件,这种在命令行下一个个文件的编译很不方便

大多数程序需要用外部函数库,也就有是文件中用到了标准库中的文件
gcc test.c -lm -L/lib -L/usr/lib
-l 表示加入函数库
m 表示libm.so这个库,-lm就是把libm.so这个库加进去链接

-Wall 编译时显示详细编译过程信息

当有十几个几十个的文件要编译,当然用make工具,一次搞定,前提是编写makefile
makefile文件就是把编译文件的命令写进文件而已
makefile基本语法和变量

target: 目标文件1 目标文件2 ...
gcc -o 二进制文件名 目标文件1 目标文件2 ...
#表示注释
tab键 是命令行的第一的字符
@符表示当前目标

例子: vi makefile
main:1.o 2.o 3.o
gcc -o test 1.o 2.o 3.o
clean:
rm -f test 1.o 2.o 3.o

这个makefile有两个目标
make main 执行main目标
make clean 执行清除文件
原来这个目标名随意,当成是make的参数
当数据重复的时候,用变量来替换,简化makefile
变量规则: 1 变量域变量内容用=隔开, 同时=两边都要有空格, 不能有:
2 变量左边不能有tab
3 习惯上变量用大写
4 运用变量是,用${变量名} 或$(变量)
5 该shell的环境变量,有的可以被makefile使用,例如CFLAGS,GCC会自动去读这个变量

例子:vi makefile
LIBS = -lm

OBJS = 1.o 2.o 3.o
CFLAGS = -Wall
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS} #这一行的main和目标同名,还可以简化成$@
clean:
rm -f main ${OBJS}

有的时候直接运行make,后面没有跟目标,说用了默认的编译方法,是怎么实现的?
答案是all目标,这个目标下的行为直接这行make的默认编译行为

链接库
静态 libxxx.a
动态 libxxx.so

linux中比较倾向使用动态库。
如果使用静态库,一旦静态库升级,所有相关的软件都要重新编译。但是用动态库,只要升级动态就可以了,只要函数名不变,软件根本不需要重新编译。动态的库的好处之一就是升级方便。

最新文章

  1. crontab这个坑,执行单个命令执行成功,但是写到crontab怎么也不行
  2. scala模拟一个timer
  3. 关于CQRS(老外经典好文)
  4. 果盟广告SDK
  5. SAP-设置显示表格格式
  6. ZOJ1204——Additive equations(DFS)
  7. JavaScript网站设计实践(五)编写photos.html页面,实现点击缩略图显示大图的效果
  8. Discuz论坛架构改造
  9. IDE idea 更换项目的JDK步骤
  10. Android Ant 和 Gradle 打包流程和效率对照
  11. MVC模式编程演示样本-登录认证(静态)
  12. Linux系统/dev/mapper目录浅谈
  13. Cocos2D实现RPG队伍菜单任意调整角色顺序的效果
  14. 通过Canvas及File API缩放并上传图片
  15. Contest2178 - 2019-4-18 高一noip基础知识点 测试7 题解版
  16. CSS3_边框 border 详解_一个 div 的阴阳图
  17. jmeter利用自身代理录制脚本
  18. Echo团队Alpha冲刺随笔 - 第一天
  19. Linux Install geoip
  20. 替换{0}为指定的字符串(MessageFormat)

热门文章

  1. linux命令之高级使用 du
  2. ext树菜单实体类
  3. import _mysql----ImportError: DLL load failed: %1 不是有效的 Win32 应用程序。
  4. TaskTracker学习笔记
  5. 第二百零五节,jQuery EasyUI,Messager(消息窗口)组件
  6. EJB包含哪3种bean
  7. ORM框架(对象关系映射)
  8. 框架应用 : Spring - 开发详述
  9. C语言程序设计-猴子选大王[链表应用]
  10. EntityFramework :数据库创建