linux源码安装软件系列1

linux软件安装

在windows安装软件是极其简单的事,无非就是下载,然后一路点击“下一步”即可。而在linux装软件就没那么简单了,尤其是对于新手而言,往往会手足无措,觉得linux很不好用。可一旦习惯了,就会惊叹于linux的强大,安装软件可以简单地用一句命令行解决从下载到安装的整个流程,比windows下的一键安装还要轻爽。也可以自己到官网下载源码,自己编译,甚至修改源码,真正自定义安装软件。

本系列文章主要讲解通过源码安装软件的原理以及方法。

我们知道,不管是windows,还是linux,最终能执行的都是二进制文件,而我们的代码是用编程语言写的文本文件,要转换成操作系统能识别的二进制码就需要编译器。

以下用实例演示编译源码的操作流程

编译单一文件

新建c语言文件:hello.c

#include <stdio.h>
int main(void)
{
    printf("Hello World\n");
}
[senlong@linux ~]$ gcc hello.c 
[senlong@linux ~]$ ll hello.c a.out 
-rwxrwxr-x 1 senlong senlong 8512 7月  27 08:44 a.out
-rw-rw-r-- 1 senlong senlong   67 7月  27 08:44 hello.c
[senlong@linux ~]$ ./a.out
Hello World

以上实例演示了hello.c源码文件经由gcc命令编译生成a.out可执行文件

相关术语解释:

  • 源码文件:即程序员写的源代码文件(hello.c)
  • 编译器:将便于人编写,阅读,维护的高级计算机语言所写作的源码程序,翻译为计算机能解读、运行的低阶机器语言的程序(gcc)
  • 可执行文件:操作系统能直接识别,可直接执行的二进制文件(a.out)

可执行文件与普通文本文件可通过file指令识别:

[senlong@linux ~]$ file hello.c
hello.c: C source, ASCII text # 普通文本文件
[senlong@linux ~]$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=29c4c64ff2985490bb17a37ef188574a0009b3da, not stripped # 可执行的二进制文件

编译多个文件

默认情况下,使用gcc编译输出的二进制文件是a.out, 我们可以将gcc的编译行为拆分成两个步骤:

  • gcc -c filename.c 生成目标文件(object file)
  • gcc -o filename.o 生成可执行文件
[senlong@linux ~]$ gcc -c hello.c
[senlong@linux ~]$ ll hello*
-rw-rw-r-- 1 senlong senlong   67 7月  27 08:44 hello.c
-rw-rw-r-- 1 senlong senlong 1496 7月  27 08:53 hello.o # object file
[senlong@linux ~]$ gcc -o hello hello.o
[senlong@linux ~]$ ll hello*
-rwxrwxr-x 1 senlong senlong 8512 7月  27 08:54 hello # 二进制文件
-rw-rw-r-- 1 senlong senlong   67 7月  27 08:44 hello.c
-rw-rw-r-- 1 senlong senlong 1496 7月  27 08:53 hello.o
[senlong@linux ~]$ ./hello
Hello World

那么问题来了,既然可以一步到位用一个命令生成可执行文件,为什么还要拆分成两步呢?

继续以下实例:

thanks.c

#include <stdio.h>
int main(void)
{
    printf("Hello World\n");
    thanks_2();
}

thanks_2.c

#include <stdio.h>
void thanks_2(void)
{
    printf("Thank you!\n");
}
[senlong@linux ~]$ gcc -c thanks.c thanks_2.c 
[senlong@linux ~]$ ll thanks*
-rw-rw-r-- 1 senlong senlong   71 7月  27 08:57 thanks_2.c
-rw-rw-r-- 1 senlong senlong 1504 7月  27 09:04 thanks_2.o
-rw-rw-r-- 1 senlong senlong   83 7月  27 08:56 thanks.c
-rw-rw-r-- 1 senlong senlong 1560 7月  27 09:04 thanks.o
[senlong@linux ~]$ gcc -o thanks thanks.o thanks_2.o
[senlong@linux ~]$ ll thanks*
-rwxrwxr-x 1 senlong senlong 8584 7月  27 09:05 thanks
-rw-rw-r-- 1 senlong senlong   71 7月  27 08:57 thanks_2.c
-rw-rw-r-- 1 senlong senlong 1504 7月  27 09:04 thanks_2.o
-rw-rw-r-- 1 senlong senlong   83 7月  27 08:56 thanks.c
-rw-rw-r-- 1 senlong senlong 1560 7月  27 09:04 thanks.o
[senlong@linux ~]$ ./thanks
Hello World
Thank you!

此时我们再来更改thanks_2.c文件:

#include <stdio.h>
void thanks_2(void)
{
    printf("Thank you very much!\n");
}

现在我们只需要单独编译thanks_2.c文件,再将两个目标文件联结重新生成可执行文件。不需要再去编译thanks.c

[senlong@linux ~]$ gcc -c thanks_2.c
[senlong@linux ~]$ gcc -o thanks thanks.o thanks_2.o
[senlong@linux ~]$ ./thanks 
Hello World
Thank you very much!

之所以要生成目标文件,是因为源码文件很多时候不是单一文件,如果其中有一个文件变化了,只需要重新编译此文件,而不用全部文件再次编译

引用外部函数库

函数库指封装好的实现一定功能的程序。可以在别的程序直接引用,如以下实例:计算sina值,调用了sin()函数

sina.c

#include <stdio.h>
#include <math.h>
int main(void)
{
    float value;
    value = sin ( 3.14 / 2 );
    printf("%f\n",value);
}
[senlong@linux ~]$ gcc sina.c
[senlong@linux ~]$ ./a.out
1.000000

以上介绍了编译源码的基本流程,可以很明显地看出,当我们的文件量大时,如有几百个、几千个文件时,如果还是按照以上这种手工编译的方式,那linux就不好玩了。下篇文章将介绍快速编译的方式。

敬请关注我的账号。

本文借鉴于鸟哥linux

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

推荐阅读更多精彩内容