第22章 软件安装:源码与Tarball

开放源码的软件安装与升级简介

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

开放源码:程序代码,写给人类看的程序语言

编译程序:将源码编译成机器能看得懂的语言

可执行文件:经过编译变成二进制程序后机器看得懂可以执行的文件

什么是函数库

类似子程序的角色,可以被调用来执行的一段功能函数

什么是make与configure

一套软件不仅仅有一个程序,而是一对程序代码文件,所以除了每个主程序和子程序均需要编译过程的命令外,还需要写上最终的链接程序。使用make命令,可以简化编译过程。

(1)执行make时,会在当前目录查找Makefile文件,该文件记录了如何编译源码

(2)Makefile由检测程序创建,软件开发商都会写一个检测程序检测用户的当前环境,并创建Makefile文件。这个检测程序一般为configure或config

什么是tarball

源码体积较大,一般使用gzip等压缩得到的压缩后的源码包就是tarball。tarball一般包括以下文件:(1)源代码文件。(2)检测程序文件。(3)本软件的安装说明。

如何安装与升级软件

(1)直接以源码通过编译来安装升级

(2)直接以编译好的二进制程序来安装和升级

使用传统程序语言进行编译的简单房里

单一程序:打印Hello World

编辑源码

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

编译与执行

[[email protected] ~]# gcc hello.c
[[email protected] ~]# ll hello.c a.out
-rwxr-xr-x. 1 root root 8503 9月   7 14:11 a.out
-rw-r--r--. 1 root root   63 9月   7 14:10 hello.c
[[email protected] ~]# ./a.out
Hello World

主程序、子程序链接:子程序的编译

编写主程序、子程序

[[email protected] ~]# vim thanks.c
#include<stdio.h>
int main(void)
{
        printf("hello world \n");
        thanks_2();
}

[[email protected] ~]# vim thanks_2.c
#include<stdio.h>
void thanks_2(void)
{
        printf("Thank you \n");
}

程序编译与链接

[[email protected] ~]# gcc -c thanks.c thanks_2.c
[[email protected] ~]# ll thanks*
-rw-r--r--. 1 root root   67 9月   7 14:26 thanks_2.c
-rw-r--r--. 1 root root 1496 9月   7 14:27 thanks_2.o
-rw-r--r--. 1 root root   77 9月   7 14:25 thanks.c
-rw-r--r--. 1 root root 1560 9月   7 14:27 thanks.o
[[email protected] ~]# gcc -o thanks thanks.o thanks_2.o
[[email protected] ~]# ./thanks
hello world
Thank you 

调用外部函数库:加入链接的函数库

以下调用sin函数

[[email protected] ~]# vim sin.c
#include<stdio.h>
int main(void)
{
        float value;
        value = sin(3.14/2);
        printf("%f\n",value);
}

编译时加入额外函数库链接

[[email protected] ~]# gcc sin.c -lm -L/lib -L/usr/lib

-l:是加入某个函数库的意思

m:则是libm.so这个函数库,lib和后缀.so不需要写

如果需要手动制定头文件(如stdio.h)的位置,可以加入”-I/usr/include“这样的指令,/usr/inlcude便是所制定的头文件存放路径

注:在我的centos7计算机上,直接使用gcc -sin.c可以编译通过,只是会报出不兼容的警告。在程序内加入#include<math.h>便不再出现警告。反而使用以上代码手动加入额外的函数库,也不能消去警告。如下:

[[email protected] ~]# gcc sin.c -lm -L/lib -L/usr/lib
sin.c: 在函数‘main’中:
sin.c:5:10: 警告:隐式声明与内建函数‘sin’不兼容 [默认启用]
  value = sin(3.14/2);
          ^

用make进行宏编译

为什么要用make

假设有以下四个文件:

main.c

#include <stdio.h>
#define pi 3.14159
char name[15];
float angle;

int main(void)
{
    printf ("\n\nPlease input your name: ");
    scanf  ("%s", &name );
    printf ("\nPlease enter the degree angle (ex> 90): " );
    scanf  ("%f", &angle );
    haha( name );
    sin_value( angle );
    cos_value( angle );
}

haha.c

#include <stdio.h>
int haha(char name[15])
{
    printf ("\n\nHi, Dear %s, nice to meet you.", name);
}

cos_value.c

#include <stdio.h>#include <math.h>#define pi 3.14159float angle;

void cos_value(void){    float value;    value = cos ( angle / 180. * pi );    printf ("The Cos is: %5.2f\n",value);}

sin_value.c

#include <stdio.h>
#include <math.h>
#define pi 3.14159
float angle;

void sin_value(void)
{
    float value;
    value = sin ( angle / 180. * pi );
    printf ("\nThe Sin is: %5.2f\n",value);
}

那么整个编译执行过程如下:

[[email protected] c]# gcc -c main.c
[[email protected] c]# gcc -c haha.c
[[email protected] c]# gcc -c sin_value.c
[[email protected] c]# gcc -c cos_value.c
[[email protected] c]# gcc -o main main.o haha.o sin_value.o cos_value.o -lm
[[email protected] c]# ./main

Please input your name: wuchao

Please enter the degree angle (ex> 90): 30

Hi, Dear wuchao, nice to meet you.
The Sin is:  0.50
The Cos is:  0.87
[[email protected] c]# 

  以上编译过程相当麻烦

以下使用make的方式编译

使用make指令编译前,需要创建一个Makefile文件

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
[[email protected] c]# vim 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
#注意,gcc前面是tab键
[[email protected] c]# rm -f main*.o
[[email protected] c]# make
cc    -c -o main.o main.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
[[email protected] c]# ./main

Please input your name: wuchao

Please enter the degree angle (ex> 90): 45

Hi, Dear wuchao, nice to meet you.
The Sin is:  0.71
The Cos is:  0.71

当我们修改过源码以后,再执行make时,只会编译那些修改过的源码文件

[[email protected] c]# make
make: “main”是最新的。

makefile的基本语法与变量

makefile文件格式如下:

目标:目标文件1 目标文件2

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

目标就是我们想要建立的信息,而目标文件就是具有相关性的object files,建立可执行的文件的语法就是<tab>按键开头的那一行。

如果想要在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 haha.o sin_value.o cos_value.o

以上代码包含两个目标main和clean,如果想要清除目标文件,可以执行”make clean“。如果想先清除再编译可执行”make clean main“。

[[email protected] c]# make clean main
rm -f main main.o haha.o sin_value.o cos_value.o
cc    -c -o main.o main.c
cc    -c -o haha.o haha.c
cc    -c -o sin_value.o sin_value.c
cc    -c -o cos_value.o cos_value.c
gcc -o main main.o haha.o sin_value.o cos_value.o -lm
[[email protected] c]# 

使用变量来简化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}

变量的基本语法:

1. 变量与变量内容以”:“隔开,两边可以有空格

2. 变量左边不可以有<tab>键

3. 变量与变量内容两边不能有”:“

4. 变量名最好使用大写

5. 运用变量时用${}或$()

6. 在该shell的环境变量是可以被套用的

7. 在命令行模式也可以定义变量

gcc在编译时会主动去读取CFLAGS这个环境变量,因此可以在命令行定义这个变量

[[email protected] c]# CFLAGS="-Wall" make clean main

也可以如下:

CFLAGS = -Wall
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}

由于环境变量既可以在命令行输入,也可以在Makefile文件内指定,所以需要确定使用规则:

1. make命令行后面加的环境变量第一优先

2. makefile里面指定的环境变量第二优先

3. shell原本具有的环境变量第三优先

[email protected]:代表当前的目标

每个makefile里面都有一个或多个目标名(如上面的main,clean),在每个目标下的指令中使用[email protected]表示获取当前的目标名

CFLAGS = -Wall
LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
main:${OBJS}
        gcc -o [email protected] ${OBJS} ${LIBS}
clean:
        rm -f main ${OBJS}

函数库管理

动态与静态函数库

静态函数库

  • 扩展名为.a,通常名为libxxx.a
  • 编译时会直接将这个函数整合到执行程序中去,所以利用静态函数库编译的文件会比较大
  • 独立执行,不需要再向外部读取函数库的数据
  • 升级难度大,函数库升级后,原执行程序也必须重新编译

动态函数库

  • 扩展名为.so,通常名为libxxx.so
  • 编译时,函数库不会整合到执行程序中去
  • 执行时,函数库文件必须存在,目录也必须正确
  • 容易升级函数库,函数库即使升级,原程序也不需要重新编译

ldconfig与/etc/ld.so.conf

通过文件配置可以将特定的动态函数库加载到内存中,以提高读取性能。

1. 首先,在/etc/ld.so.conf下写入需要的动态函数库所在的目录

2. 利用ldconfig将/etc/ld.so.conf的数据读入缓存

3. 同时也将数据记录一份在/etc/ld.so.cache中

编辑配置文件/etc/ld.so.conf

[root[email protected] c]# vim /etc/ld.so.conf

include ld.so.conf.d/*.conf
/usr/lib/mysql    #新添加的

读入缓存

[[email protected] c]# ldconfig

程序的动态函数库解析

查看二进制文件使用了哪些动态函数库

[[email protected] c]# ldd /usr/bin/passwd
    linux-vdso.so.1 =>  (0x00007ffc3b1b8000)
    libuser.so.1 => /lib64/libuser.so.1 (0x00007f48e7a48000)
    libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007f48e77f8000)
    libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f48e74c0000)
    libpopt.so.0 => /lib64/libpopt.so.0 (0x00007f48e72b0000)
    libpam.so.0 => /lib64/libpam.so.0 (0x00007f48e70a0000)
    libpam_misc.so.0 => /lib64/libpam_misc.so.0 (0x00007f48e6e98000)
    libaudit.so.1 => /lib64/libaudit.so.1 (0x00007f48e6c70000)
    libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f48e6a48000)
    libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f48e6828000)
    libc.so.6 => /lib64/libc.so.6 (0x00007f48e6460000)
    libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f48e6258000)
    libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f48e6020000)
    libffi.so.6 => /lib64/libffi.so.6 (0x00007f48e5e18000)
    libdl.so.2 => /lib64/libdl.so.2 (0x00007f48e5c10000)
    libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f48e59a8000)
    liblzma.so.5 => /lib64/liblzma.so.5 (0x00007f48e5780000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f48e7e88000)
    libfreebl3.so => /lib64/libfreebl3.so (0x00007f48e5578000)

检查软件的正确性

使用md5sum或sha1sum可以查看软件的MD5或SHA1编码

[[email protected] c]# md5sum main
e6adaa0b35ee4daa1cd7e43916e2d693  main
[[email protected] c]# sha1sum main
7735cf8f7ed60ccbad3dcf94fb52be0abe26817b  main
时间: 2024-11-08 01:00:00

第22章 软件安装:源码与Tarball的相关文章

2018-04-27 《鸟哥的Linux私房菜 基础学习篇(第四版)》 第22章 软件安装RPM, SRPM 与YUM 笔记

Linux 界软件安装方式最常见的有两种:?dpkg:这个机制最早是由 Debian Linux 社群所开发出来的,透过 dpkg 的机制, Debian 提供的软件就能够简单的安装起来,同时还能提供安装后的软件信息,实在非常不错. 只要是衍生于 Debian 的其他 Linux distributions 大多使用 dpkg 这个机制来管理软件的, 包括 B2D, Ubuntu 等等.?RPM:这个机制最早是由 Red Hat 这家公司开发出来的,后来实在很好用,因此很多 distributi

别人的Linux私房菜(22)软件安装:源代码与Tarball

执行make,会在当前目录查找makefile文本文件(记录了源代码如何编译的详细信息). 内核相关的函数信息放置在/usr/lib./usr/lib64里. 在Tarball(一般为xxx.tar.gz)中,软件开发商通常提供了源码,提供configure文件或config文件(检测用户的操作环境,并建立makefile文件),本软件的简易说明和安装说明. configure文件或config文件检测的内容包括编译器,函数库,操作系统平台,头文件等. 软件Tarball安装步骤,将Tarbal

开源一个常用的小软件的源码——系统数据库服务管理软件

郝喜路  2014年7月27日22:28:34 GitHub地址:https://github.com/haoxilu/ServiceManager    希望编程爱好者 更改添加...   开发环境:Visual Studio 2012   .Net Framework 4.0 大家在软件开发过程中,是离不开 数据库的,不管你用什么数据库,都会在系统服务上注册一个,当你安装了太多的数据库,是否有感到极大的拖掉了开机时间,影响了计算机的性能.(仅限windows系统).这时有的朋友可能会想到手动

Linux下Zabbix_Server的安装-源码安装

Centos下Zabbix_Server/agent/proxy的安装配置 --------源码编译 完整版请查看附件 一.环境说明 a)软件环境 由于是源码安装,官方的zabbix源码包内已经包含了Server,Proxy, Agent, GUI所有组件和必要的执行脚本,截至本文正式版本限于2.2.3: LAMP环境 n操作系统使用Centos6.5 X86_64 最小化安装,并yum update到最新状态,内核版本为2.6.32-431.17.1.el6.x86_64: nMysql 使用

openwrt教程 第二章 下载openwrt源码

2.1 开发环境 我们工作室(F403科技创意室:http://f403tech.taobao.com/)写的该教程,所使用的环境为: VMware Workstation:VMware 8 Ubuntu:Ubuntu12.04 具体环境搭建过程,可以向客服索要用户手册!上面有非常详细的过程! 2.2 准备工作 再下载.配置.编译openwrt系统之前,我们需要做些准备工作,安装一些必须的工具.库. (1) 安装SVN工具 安装SVN工具,用于下载openwrt源码: $ sudo apt-ge

《GIS软件ShapMap源码详解及应用》概述

我喜欢GIS二次开发,即使有的人看不起:我不懂开源GIS,只会点商业的GIS,有的人更加瞧不起.我认为,我不能改变现实这个环境,但可以创造一些价值.找到一本<GIS软件ShapMap源码详解及应用>来学习,我倒要看看开源GIS是什么样子. 当前GIS软件有商业GIS系统及开源GIS系统之分.GIS商用软件功能强 大,有完善的技术支持,提供封装好的.功能强大的类库,基于商用GIS库进 行的二次开发效率高.难度低.资源丰富.但对于小型GIS开发人员,商用 GIS价格过高,对于GIS学习者来说,由于

安装源码包inotify启动失败 error while loading shared libraries: libinotifytools.so.0: cannot open shared object fil

今天安装源码包inotify 一切安装妥当之后启动失败,报如下错误: 第一感觉是找不到这个库,此时有两种可能 1,操作系统上没有安装该库 2,操作系统找不到该库 首先在/usr路径下查找该包的名称,如下图 ps:为什么要在/usr下找呢,因为库文件一般都安装在该目录下. 结果只在源码包的安装路径下找到了该库,证明以源码包形式安装该软件的时候该库已经被安装在操作系统中了. 这就验证了上边的第2项,操作系统找不到该库的路径. 此时我们应该想怎么让操作系统找到该库 在这之前呢我们要先知道一点,程序里面

centos安装源码包 示例安装apache

在Linux下安装源码包时最常用的,需要我们把源代码编译成可执行的二进制文件.Linux上的C语言编译器称为gcc,利用它可以把C语言编译成可执行的二进制文件. 如果没有安装gcc,就无法编译源码,你可以使用命令yum install -y gcc来完成安装. 安装源码包的3个步骤: 1)./configure 这一步可以定制功能,加上相应的选项,具体可以有什么选择可以通过命令./configure --help来查看.这一步会自动检测你的Linux系统与相关的套件是否有编译该源码包时所需的库,

[CentOS]使用光盘作为yum软件安装源

[CentOS]使用光盘作为yum软件安装源 当Linux无法上网,但是有需要安装一些软件时,如果有系统镜像iso,那么我们可以从光盘中来安装一些软件,当然前提是光盘中有这些软件. 首先插入光驱,并挂载到文件系统中来 # 挂载光驱 mkdir /media/cdrom mount /dev/cdrom /media/cdrom 然后到yum的源配置文件路径 cd /etc/yum.repo.d/ 这个目录下默认应该有很多文件,例如 CentOS-Base.repo CentOS-Media.re