Linux笔记---源码方式安装软件

1. 什么是开放源码、编译程序与可执行文件

我们使用特定编程语言(如C或Java等),编写的纯文本文件即为源码文件。在完成源码文件的编写之后,再通过编译程序将源码文件编译成操作系统看得懂的二进制可执行文件。

在Linux上最标准的程序语言为C,所以我们使用C语法写完源码(以*.c扩展名形式存在)后,以Linux上标准C语言的编译程序gcc这个程序来编译,就可以制作一个可执行的二进制程序。

事实上,在编译过程中还会生成目标文件(以*.o扩展名形式存在)。此外,有时候,我们会在程序当中调用其他的外部子程序,或者是利用其他软件提供的函数功能,这个时候,我们就必须在编译的过程当中将该函数库加进去。如此一来,编译程序就可以将所有的程序代码与函数库做一个链接以生成正确的可执行文件。

2. 使用传统程序语言进行编译

  • 单源码文件制作可执行文件:
// 比如我们用C编写一个hello.c的源代码,期望输出Hello World!
vim hello.c
// 我们可以用gcc编译,可执行文件的文件名默认是a
gcc hello.c
// 执行
./a.out
  • 多源码文件利用目标文件制作可执行文件:

由于源码文件有时候并非只有一个,所以我们无法直接进行编译。这个时候就需要先生成目标文件,然后再以链接制作成为二进制可执行文件。

// 通过-c参数编译目标文件。-O参数为生成优化
gcc [-O] -c thanks_1.c thanks_2.c
// 此时目录里多了thanks_1.o和thanks_2.o两个目标文件
// 进行链接成为可执行文件,通过-o参数指定生成的可执行文件名。-Wall参数可产生更多的编译过程信息
gcc [-Wall] -o thanks thanks_1.o thanks_2.o
// 然后就可以执行了
./thanks
  • 加入外部函数库

// 若上面的代码使用到了三角函数sin,那么在生成可执行文件时,要链入函数库
gcc [-Wall] -o thanks thanks_1.o thanks_2.o -lm [-L/lib -L/usr/lib -I/usr/include]
// -l:是加入某个函数库的意思
// m:则是libm.so这个函数库,其中,lib与扩展名(.a或.so)不需要写
// 所以-lm表示使用libm.so(或libm.a)函数库的意思。
// -L:后面接的路径是函数库搜索目录。上面是Linux默认函数库目录,可以不写
// -I:后面接的路径是源码内的include文件的所在目录。上面是Linux默认include目录,可以不写


### 3. 用make进行宏编译
* 为什么要用make
假设有4个源码文件,分别是main.c、haha.c、sin_value.c和cos_value.c。按照上面的方式,我们得这么做:

// 1. 先进行编译目标文件,最终会有4个.o的文件出现
gcc -c main.c
gcc -c haha.c
gcc -c sin_value.c
gcc -c cos_value.c
// 2. 再链接成为可执行文件,并加入libm数学函数,以生成main可执行文件
gcc -o main main.o haha.o sin_value.o cos_value.o -lm -L/usr/liba -L/lib
// 3. 运行文件
./main

>   一套软件通常有一堆程序代码文件,使用gcc来编译的过程并不简单。可以使用make进行编译过程的简化。
  执行make时,会在当前目录下搜索Makefile文件,Makefile文件记录了源码如何编译的详细信息。通常软件开发商会在软件包里提供configure(或config)文件,用以检测用户的操作系统环境是否满足条件。
  所以,你要进行的任务只有两个,先执行./configure生成Makefile,再执行make编译。

* 尝试使用make  
vi makefile

// 1. 先编辑makefile规则文件,内容只要制作出main这个可执行文件
main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
// 注意第二行的gcc之前是<tab>键生成的空格

// 2. 使用makefile规则文件进行编译
rm -f main *.o <==现将之前的目标文件移除
make

* makefile的基本语法与变量

目标: 目标文件1 目标文件2...
<tab> gcc -o 预新建的可执行文件 目标文件1 目标文件2

以刚才上一个范例进一步说明,我们也可以有两个以上的操作:
vi makefile

main: main.o haha.o sin_value.o cos_value.o
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
clean:
rm -f main main.o hah.o sin_value.o cos_value.o

如此一来,makefile就具有两个目标,如果想要清除,输入make clean,如果想要建立main,输入make main。如果想要先清除再生成main,则输入make clean main

* 用变量简化makefile
vi makefile

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main: ${OBJS}
gcc -o main ${OBJS} ${LIBS}
clean:
rm -f main ${OBJS}

* Tarball软件安装的步骤
 1. ./configure --prefix=/usr/local/apache
这个步骤就是建立makefile文件。这个步骤的相关信息应该要参考一下同目录下的README或INSTALL文件。configure比较重要的参数是--prefix,表示软件最终安装的目录,如果没有指定,默认为/usr/local。可以只用./configure --help查看有哪些参数。
 2. make clean
清理目标文件。因为谁也不知道源码里是否包含上次编译过的目标文件(*.o)存在。
 3. make
make会依据makefile当中的默认工作进行编译的行为。主要是进行gcc来将源码编译成可执行文件,通常还需要一些函数库的链接。可执行文件放置在当前目录下。
 4. make install
最后的安装步骤,依据makefile里关于install的选项,将数据安装到默认的目录中,就完成了。
* Tarball软件安装建议
通常建议把软件安装在/usr/local/software下,源码则放在/usr/local/src下。
例如,我们将apache安装在/usr/local/apache当中,那么你的目录会变成:

/usr/local/apache/etc
/usr/local/apache/bin
/usr/local/apache/lib
/usr/local/apache/man

为避免每次使用绝对路径执行的麻烦,可以将/usr/local/apache/bin加入PATH里。
另外/usr/local/apache/man也需要加入man page搜索路径中去。
/etc/man.config内的40~50行左右写入如下一行:

MANPATH/usr/local/apache/man


### 4. 增加函数库的读取性能 
>   函数库分为静态和动态函数库,静态函数库在编译的时候直接整合到执行程序中,所以最终文件会比较大些,若函数库升级,整个可执行文件必须重新编译才能整合新版函数库。
  动态函数库,没有别整合到可执行文件里,当可执行文件使用到函数库时,程序才会去读取函数库使用。Linux大多是将函数库做成动态函数库。  

* 增加函数库读取性能 
比如mysql的函数库在/usr/lib/mysql位置,我可以这么做: 
vi /etc/ld.so.conf 

include ld.so.conf.d/*.conf
/usr/lib/mysql <==这一行新增的

// 将/etc/ld.so.conf的数据读入缓存当中,同时也将数据记录一份在/etc/ld.so.cache文件中
idconfig

// 列出目前所有函数库数据内容(/etc/ld.so.cache内的数据)
ldconfig -p

* 解析程序依赖的动态函数库 

// -v选项,增加显示其他版本信息
ldd [-v] /usr/bin/passwd

### 5. 校验软件正确性
   软件下载站,一般提供了软件的md5或sha1指纹码,可以用以下方式校验是否被修改过: 
* 对比指纹 

// 将结果与网站的指纹码比对,一致则未被他人修改
md5sum CentOS-5.3-i386-netinstall.iso sha1sum CentOS-5.3-i386-netinstall.iso

我们可以利用这个机制,为Linux系统上一些重要的文件创建指纹数据库,比如下面这些文件: 
/etc/passwd 
/etc/shadow(假如你不让用户改密码了) 
/etc/group 
/usr/bin/passwd 
/sbin/portmap 
/bin/login(这个也很容易被黑客利用) 
/bin/ls 
/bin/ps 
/usr/bin/top 
使用md5sum检查一次,将指纹记录下来,然后经常以shell script方式由程序自行检查指纹是否一致。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容

  • 《鸟哥的Linux私房菜》笔记 提到Linux,就不得不提GNU和GPL授权所产生的自由软件(free softw...
    Zhang21阅读 11,365评论 0 15
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,669评论 0 27
  • 动态链接,在可执行文件装载时或运行时,由操作系统的装载程序加载库。大多数操作系统将解析外部引用(比如库)作为加载过...
    小5筒阅读 5,350评论 0 3
  • 来自陈浩的一片老文,但绝对营养。 示例工程:3 个头文件*.h,和 8 个 C 文件*.c。 初 编译过程,源文件...
    周筱鲁阅读 4,605评论 0 17
  • 【感悟】 1、说服情绪,找个目标 每次起床总是那么困难,都会拖个10分钟左右。起床前,情绪占据上风,不想离开温暖的...
    i期待阅读 97评论 0 0