Linux软件安装:源代码与Tarball

文章目录

  • Linux源码包的安装与升级
    • 什么是源代码、编译器与可执行文件
    • 什么是函数库
    • 什么是make与configure
    • 什么是Tarball的软件
    • 如何安装与升级软件
  • 使用gcc进行编译的简单实例
    • 单一程序:打印 Hello World
    • 主、子程序链接:子程序的编译
    • 调用外部函数库:加入链接的函数库
    • gcc的简易用法(编译、参数与连接)
  • 用make进行宏编译
    • 为什么要用make
    • makefile 的基本语法与变量
  • Tarball管理
    • Tarball安装的基本步骤
    • 一般 Tarball 软件安装的建议事项

Linux源码包的安装与升级

如果你想在自己的Linux服务器上运行网站,就需要安装一个Web服务器软件,否则无法提供Web服务。所以学会如何安装软件非常重要。

Windows操作系统上安装软件很简单,只需要一直按下一步就可以。但是,因为Windows软件源代码是封闭的,所以无法修改它的功能或添加新功能。这就意味着,如果你的电脑受到病毒或黑客攻击,你只能等待软件开发商提供的修补程序,而不能自己修补。

相比之下,如果你在Linux上安装软件,你可以修改和自定义软件功能,甚至可以修补软件漏洞,因为Linux的软件源代码是开放的。这样可以增加你的电脑安全性,减少受到攻击的风险。

==Linux的优点在于它的软件几乎都是开放源代码的,这意味着每个软件都提供源代码,你可以自己修改它,以适合自己的需求。==开放源代码的好处在于你可以自由定制软件,增加或减少功能,甚至修补漏洞。但是,你需要理解什么是开放源代码,源代码是什么,以及在Linux上安装软件时,安装文件和源代码之间的关系。不同版本的Linux是否可以使用相同的执行文件,还是需要重新转换源代码,这些都是需要了解的概念。下面就以源代码与可执行文件来进行说明

什么是源代码、编译器与可执行文件

在Linux系统中,可执行文件是指二进制程序,比如 /usr/bin/passwd/bin/touch 等文件。这些文件需要具有可执行权限(即有 x permission)才能被执行。与之不同的是,shell脚本是使用 shell 程序(如 bash)的功能进行一些判断,最终还是需要执行一些已经编译好的二进制程序。因此,shell本身也是一个二进制程序。

要判断一个文件是否为二进制程序,可以使用 file 命令来查看。

[root@localhost ~]# file /bin/bash
/bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=85e3da5a087950e7aaeb7893c056218a8874d2e5, stripped

看到了吗?如果一个文件是二进制程序,并且具有可执行权限,那么使用 file 命令时会显示它的执行文件类别(如 ELF 64-bit LSB executable),同时也会显示是否使用动态函数库(shared libs)。如果一个文件只是一般的脚本,那么 file 命令会显示它是文本可执行文件(text executable)等字样。

既然Linux操作系统真正认识的其实是二进制程序,那么我们是如何做出这样的一个二进制程序的呢?制作一个二进制程序的过程分为两步编写源代码和编译源代码。编写源代码时,我们使用的是文本编辑器,比如 vim,来写出一段程序的文字描述;这个文件就是源代码文件,它本质上是一个纯文本文件。接着,我们需要使用编译器来将这个源代码文件编译成操作系统认识的二进制程序。在Linux系统中,最常用的编程语言是C语言,所以我们可以使用标准的C语言编译器——gcc,来将C语言源代码文件编译成可执行的二进制程序。

流程图如下:

image-20230528100942027

在编译过程中,编译器会将源代码文件编译成目标文件(object file),这些目标文件通常以 *.o 的扩展名存储。同时,我们在编写程序时,可能会引用或调用其他外部的子程序或函数,这时候我们需要在编译的过程中将这些函数库加入到我们的程序中。这样,编译器就会将所有的程序代码与函数库链接在一起,生成最终的可执行文件。在C语言中,源代码文件通常以 *.c 作为扩展名,而函数库文件通常以 *.a 或 *.so 的扩展名存储。

  • 开放源代码:就是程序代码,写给人类看的程序语言,但机器并不认识,所以无法执行
  • 编译器:将程序代码转译成为机器看得懂的语言,就类似翻译者的角色
  • 可执行文件:经过编译器变成的二进制程序,机器看得懂所以可以执行

什么是函数库

在前面的流程图中,提到了函数库,那么什么是函数库?函数库是一组编写好的程序代码,可以在其他程序中被调用和重复使用。它们通常被组织成一个或多个文件,以便在需要时链接到程序中。在Linux系统中,PAM模块就是一个函数库,提供了验证用户身份和记录日志等功能,其他程序可以直接调用PAM的函数来实现身份认证,而不需要重新编写认证机制。此外,Linux内核也提供了很多函数库,可以供硬件开发者使用。

函数库又分为动态与静态函数库

image-20230528110537538

如上图,如果需要使用一个函数库里面的函数,就需要在编译程序的时候加入相关的设置,让程序知道去哪里找到这个函数库。在Linux系统中,提供了很多与内核相关的函数库和参数,这些信息对于设计硬件驱动程序非常有用,它们通常被放置在/usr/include、/usr/lib、/usr/lib64这些目录中。

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

什么是make与configure

在使用类似gcc这样的编译器编译程序时,有多个程序文件需要编译,并且还需要写一个最终的链接程序。对于程序代码比较简短的情况,这并不是很麻烦,但是对于像WWW服务器软件(比如Apache)或者内核这样的大型程序,编译过程非常繁琐,需要写很多编译命令。为了简化这个过程,我们可以使用make命令来自动化编译过程,从而减少编译命令的编写量。

当使用make命令时,它会在当前目录下查找Makefile文件,这个文件记录了源代码如何编译的详细信息。make命令会自动判断源代码是否被修改过,如果有修改,则自动更新执行文件,这使得make成为了软件工程师非常实用的辅助工具。

make是一个程序,会去找Makefile,那么Makefile怎么写?通常软件开发商都会写一个检测程序来检测用户的操作环境,以及该操作环境是否有软件开发商所需要的其他功能,该检测程序检测完毕后,就会主动地建立中Makefile的规则文件,通常这个检测程序的文件名为configure或是config。

为什么要检测环境呢?因为不同版本的内核所使用的系统调用可能不同,每个软件所需要依赖的内核函数库也不同,同时,软件开发商不仅针对Linux开发,还可能针对整个UNIX-like系统进行开发,因此需要检测操作系统平台是否提供了所需要的编译器等工具。一般来说没检测程序会检测的内容大约有下面这些:

  • 是否有适合的编译器可以编译本软件的程序代码
  • 是否已经存在本软件所需要的函数库,或其他需要的依赖文件
  • 操作系统平台是否适合本软件,包括Linux的内核版本
  • 内核的头文件是否存在(驱动程序必须要的检测)

下面的图表明了整个过程中需要完成两个任务:

(1)执行configure来建立Makefile,这个步骤必须成功完成,只有成功之后才能(2)调用make命令进行编译所需的数据。简单来说,configure是在检测和设置编译环境之后生成Makefile,而make则是根据Makefile来编译执行文件。这两个命令在整个编译过程中起到了非常重要的作用。

image-20230528160951900

什么是Tarball的软件

Tarball文件就是将软件的源代码文件使用tar命令打包成一个文件,再使用压缩技术将其压缩。最常见的压缩技术是gzip,因此Tarball文件的扩展名一般为.tar.gz或.tgz。由于利用了tar和gzip的功能,Tarball文件可以将软件的所有源代码文件打包在一起,方便用户进行传输和备份。近来,由于bzip2和xz的压缩率较高,Tarball文件也开始使用这些压缩技术,并相应地更改了扩展名,如.tar.bz2和.tar.xz等。用户在下载Tarball文件后,需要使用tar命令和相应的压缩解压工具进行解压缩,然后按照软件提供的安装说明进行编译和安装。所以说Tarball是一个软件包,你将它解压缩后,里面的文件通常就会有:

  • 源代码文件
  • 检测程序文件(可能是configure或config等文件)
  • 本软件的建议说明与安装说明(README 或 INSTALL)

如何安装与升级软件

使用源代码编译安装:有些软件可能没有官方的软件包,只提供源代码,可以通过下载源代码并进行编译安装来安装软件,繁琐时间很漫长。

直接以编译好的二进制程序来安装与升级:这样做的好处就是省略了检测与编译等繁杂的过程。

那么源码包如何安装呢?基本流程是这样的

  1. 将Tarball 由厂商的网站下载
  2. 将Tarball 解开,产生很多的源代码文件
  3. 开始以GCC 进行源代码的编译 (会产生目标文件 object files)
  4. 然后以 gcc 进行函数库、主、子程序的链接,以形成主要的二进制文件
  5. 将上述的二进制文件以及相关的配置文件安装至自己的主机上面

使用gcc进行编译的简单实例

单一程序:打印 Hello World

我第一个程序的就是再屏幕上面打印【Hello World】的字样

  1. 首先你得确认你Linux系统立马已经安装了gcc,如果尚未安装gcc的话,需要安装一下gcc
[root@localhost ~]# yum install -y gcc
  1. 编写程序代码,就是源代码
[root@localhost ~]# vim hello.c
#include <stdio.h>
int main()
{
   printf ("hello,Word!\n");
}

  1. 开始编译与测试运行
[root@localhost ~]# gcc hello.c
[root@localhost ~]# ll hello.c a.out 
-rwxr-xr-x. 1 root root 8360 528 19:05 a.out   # 此时会产生这个文件
-rw-r--r--. 1 root root   63 528 19:04 hello.c
[root@localhost ~]# ./a.out 
hello,Word!

在默认状态下,如果我们直接使用gcc编译源代码,并且没有加上任何参数,那么生成的可执行文件的文件名会被自动设置为a.out,因此我们可以直接通过./a.out来运行它。

但是,如果我们想生成目标文件(比如hello.o)来进行其他操作,而且不想使用默认的a.out作为可执行文件的文件名,那该怎么办呢?这时候,我们可以使用以下命令来编译源代码:

[root@localhost ~]# gcc -c hello.c 
[root@localhost ~]# ll hello*
-rw-r--r--. 1 root root   63 528 19:04 hello.c
-rw-r--r--. 1 root root 1496 528 19:20 hello.o   # 这个就是被产生的目标文件
[root@localhost ~]# gcc -o hello hello.o
[root@localhost ~]# ll hello*
-rwxr-xr-x. 1 root root 8360 528 19:21 hello     # 这个就是可执行文件,-o的结果
-rw-r--r--. 1 root root   63 528 19:04 hello.c
-rw-r--r--. 1 root root 1496 528 19:20 hello.o
[root@localhost ~]# ./hello 
hello,Word!
# -c表示只编译源代码,不进行链接操作  hello.c是源代码的文件名
# -o表示指定输出文件的文件名

这个步骤主要是利用hello.o这个目标文件制作出一个名为 hello 的执行文件。

那么你可能会觉得,只要生成一个a.out 就好了,干嘛要先定制目标文件再做成执行文件?

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

如果我们在一个主程序里面又调用了另一个子程序?这是很常见的一个程序写法,因为可以提高整个程序的易读性。下面例子中,我么以thanks.c 整个主程序去调用 thanks_2.c 整个子程序

  1. 编写所需要的主、子程序
[root@localhost ~]# vim thanks.c
#include <stdio.h>
int main()
{
  printf ("Hello,word!\n");
  thanks_2();
}
# 上面的 thanks_2();那一行就是调用子程序
[root@localhost ~]# vim thanks_2.c
#include <stdio.h>
int thanks_2()
{
   printf ("Thank you!\n");
}
  1. 进行程序的编译与链接(link)
[root@localhost ~]# gcc -c thanks.c  thanks_2.c 
[root@localhost ~]# ll thanks*
-rw-r--r--. 1 root root   66 528 20:16 thanks_2.c
-rw-r--r--. 1 root root 1504 528 20:18 thanks_2.o  # 编译产生的
-rw-r--r--. 1 root root   76 528 20:15 thanks.c
-rw-r--r--. 1 root root 1560 528 20:18 thanks.o    # 编译产生的
[root@localhost ~]# gcc -o thanks thanks.o thanks_2.o 
[root@localhost ~]# ll thanks*
-rwxr-xr-x. 1 root root 8424 528 20:19 thanks      # 最终结果产生了
  1. 执行一下这个文件
[root@localhost ~]# ./thanks 
Hello,word!
Thank you!

知道为什么要制作出目标文件了吗?在编写程序的过程中,我们通常会将程序分为多个源代码文件,每个文件都实现了程序的一部分功能。如果我们直接编译所有的源代码文件,那么编译器就需要把所有的代码都编译成一个目标文件或可执行文件,这会导致编译时间过长和可维护性差。
为了解决这个问题,我们可以先将每个源代码文件编译成一个目标文件,这个目标文件包含了该文件中所有的函数和变量的二进制代码。然后在链接阶段,将所有的目标文件链接在一起,生成一个可执行文件或库文件。
这种分步编译的方式可以加快编译速度,同时也方便了程序的维护和更新。如果我们修改了一个源代码文件,只需要重新编译这个文件,然后链接所有的目标文件即可,而不需要重新编译整个程序。
因此,制作目标文件是为了方便程序的编译和维护,同时也提高了编译的效率。

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

如果我们想要计算出三角函数里面的sin(90度角)。要注意的是,大多数的程序语言都是使用弧度而不是一般我们计算的【角度】,180度叫约等于3.14弧度

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

那要如何编译这个程序?我们先直接编译看看

[root@localhost ~]# gcc sin.c
#  新的gcc会主动将函数放进来给你用,所以只要加上 include <math.h>就好了

新版的gcc编译器可以自动识别需要链接的函数库,并将其包含在编译过程中,这样就可以避免一些奇怪的错误信息。例如,数学函数库的名称是libm.so,编译时可以使用-lm参数来链接该库。
需要注意的是,libm.so函数库通常被放置在系统默认的/lib和/lib/64目录下,因此无需使用-L参数来指定库文件的查找目录。

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

[root@localhost ~]# gcc sin.c -lm -L/lib -L/lib64   # 重点在-lm
[root@localhost ~]# ./a.out                         # 尝试执行新文件
1.000000
  • -l:是【加入某个函数库(library)】的意思
  • m:则是libm.so 这个函数库,其中,lib 与扩展名 (.a 或.so)不需要写

所以 -lm 表示使用 libm.so (或libm.a)这个函数库的意思,至于那个-L 后面接的路径表示:【我要的函数库libm.so 请到 /lib 或 /lib64 里面查找】

在Linux系统中,默认情况下函数库被放置在/lib和/lib64目录下,因此在编译程序时不需要使用-L/lib和-L/lib64参数进行指定。
但是,如果你使用的函数库不在这两个目录下,就需要使用-L参数来指定函数库所在的路径,否则编译器无法找到函数库文件。
除了链接函数库,我们还需要使用#include指令来引入其他的头文件,以便在程序中使用该头文件中定义的函数和变量。例如,在sin.c文件中,我们使用了stdio.h头文件中定义的printf函数。
通常情况下,头文件被放置在/usr/include目录下。但是,如果你的头文件不在这个目录下,就需要使用-I参数来指定头文件所在的路径。这样编译器就可以找到并正确地引用头文件中定义的函数和变量

[root@localhost ~]# gcc sin.c -lm -I/usr/include

gcc的简易用法(编译、参数与连接)

gcc常用的参数如下

# 仅将源代码编译成为目标文件
[root@localhost ~]# gcc -c hello.c
# 会自动产生hello.o 这个文件,但是并不会产生二进制执行文件

# 在编译的时候,根据操作环境给予最佳执行速度
[root@localhost ~]# gcc -O hello.c -c
# 会自动参数hello.o 这个文件,并且执行速度最佳

# 在进行二进制文件制作时,将链接的函数库与相关的路径加入
[root@localhost ~]# gcc sin.c -lm -L/lib/ -I/usr/include
# 这个命令较常使用在最终链接成为二进制文件的时候
# -lm 指的是 libm.so 或 libm.a 这个函数库文件
# -L 后面接的是路径是刚刚上面那个函数库的查找目录
# -I 后面接的是源代码内的 include 文件之所在目录

# 将编译结果输出成某个特定文件名
[root@localhost ~]# gcc -o hello hello.c
# -o 后面接的是要输出的二进制文件名

# 在编译的时候,输出较多的信息说明
[root@localhost ~]# gcc -o hello hello.c -Wall
# 加入 -Wall之后,程序的编译会变的较为严谨一点,所以警告信息也会显示出来

用make进行宏编译

为什么要用make

先来想象一个案例,假设我的执行文件里面包含了4个源代码文件,分别是main.c、haha.c 、 sin_value.c 、cos_value.c ,这4个文件的目的是:

  • main.c:主要的目的是让用户输入角度与调用其他3个子程序
  • haha.c:输出一堆有的有没的信息
  • sin_value.c:计算用户输入的角度(360)的sin值
  • cos_value.c:计算用户输入的角度(360)的cos值

由于这四个文件里面包含了相关性,并且还用到数学函数,所以如果想让这个程序可以运行,那么就需要这样编译:

  1. 先进行目标文件的编译,最终会有四个 *.o 的文件名出现
[root@localhost ~]# gcc  -c main.c
[root@localhost ~]# gcc  -c haha.c
[root@localhost ~]# gcc  -c sin_value.c
[root@localhost ~]# gcc  -c cos_value.c
  1. 再进行链接成为执行文件,并加入libm数学函数,以产生main执行文件
[root@localhost ~]# gcc -o main main.o haha.o sin_value.o cos_value.o -lm
  1. 本程序的执行结果,必须输入姓名、360度角的角度来计算
[root@localhost ~]# ./main
Please input your name: CSQ
Please enter the degree angle (ex> 90): 30
Hi,Dear CSQ,nice to meet you.
The Sin is: 0.50
The Cos is: 0.87

可以看到编译的过程需要进行很多操作,而且如果要重新编译,则上述的流程要得重新来一遍。这时候我们就可以用make这个工具。在这个目录下建立一个名为 makefile 的文件,内容如下:

  1. 先编辑 makefile 这个规则文件,内容只要有 main 这个执行文件
[root@localhost ~]# 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>按键产生的空格
  1. 尝试使用makefile制订的规则进行编译操作
[root@localhost ~]# make
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
# 此时make会去读取makefile的内容,并根据内容直接去给它编译相关的文件
  1. 在不删除任何文件的情况下,重新执行一次编译的操作
[root@localhost ~]# make
make: `main' is up to date
# 只会进行更新(update)的操作而已

make是一个工具,可以自动化编译程序,它可以帮助程序员在修改代码后,只编译修改过的部分,从而节省编译时间。使用make可以方便地编译程序,因为它会自动判断哪些文件需要重新编译,而不必手动编译每个文件。这样可以让程序员更加专注于程序的开发,而不必花费太多时间在编译上。

make的好处:

  • 简化编译时所需执行的命令
  • 若在编译完成之后,修改了某个源代码文件,则make仅会针对被修改的文件进行编译,其他文件不会被修改
  • 最后可以依照依赖性来更新(update)执行文件

而make里面最需要注意的就是makefile规则文件

makefile 的基本语法与变量

基本的makefile规则是这样的

目标(target):目标文件1 目标文件2
<tab> gcc -o 欲建立的执行文件 目标文件1 目标文件2

特别注意:命令行必须要以Tab键作为开头才行

  • 在makefile当中的 # 代表注释
  • 需要在命令行(例如gcc这个编译器命令)的第一个字符
  • 目标(target)与依赖文件(就是目标文件)之间需要以【:】隔开

那么如果我要有两个以上的操作呢?例如执行一个命令就直接清楚掉所有目标文件与执行文件.

  1. 先编辑makefile 建立新的规则,此规则的标的名称为 clean
[root@localhost ~]# 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
clean:
	rm -f main main.o haha.o sin_value.o cos_value.o
  1. 以新的目标(clean)测试看看执行make的结果
[root@localhost ~]# make clean    # 通过 make 以 clean 为目标
rm -rf main main.o haha.o sin_value.o cos_value.o

如此一来,我们的makefile中就具有至少两个目标,分别是 main 与 clean:如果我们想要建立 main 的话,输入 【make main】;如果想要清楚所有文件,输入【make clean】即可。而如果想要清除目标文件再编译 main 这个程序的话,就可以输入【make clean main】,如下所示

[root@localhost ~]# make clean main

如果你觉得makefile怎么重复输入的数据这么多,可以使用shell脚本学到的【变量】来简化makefile

[root@localhost ~]# vim 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}

bash shell 脚本的语法有点不太相同,变量的基本语法为:

  • 变量与变量内容以【=】隔开,同时两边可以具有空格
  • 变量左边不可以有,例如上述例子一样
  • 在习惯上,变量最好是以【大写字母】为主
  • 运行变量时,以 变量或 {变量}或 变量(变量)使用;
  • 在该shell的环境变量是可以被套用的
  • 在命令行模式也可以设置变量

由于gcc 在进行编译的操作时,会主动读取 CFLAGS这个环境变量,所以,你可以直接在 shell 中定义出这个环境变量,也可以在 makefile 文件里面去定义,更可以在 命令行中设置这个东西,例如:

[root@localhost ~]# CFLAGS="-Wall" make clean main
# 这个操作在使用 make进行编译时,会去读取 CFLAGS 的变量内容

也可以这样

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

那么万一这个CFLAGS 的内容在命令行与makefile里面并不相同,以哪个方式输入为主呢?

环境变量规则是这样的:

  • make命令行后面加上的环境变量为优先
  • makefile 里面指定的环境变量第二
  • shell原本具有的环境变量第三

此外,还有一些特殊的变量需要了解

  • $@:代表目前的目标(target)

所以我也可以将makefile改成:

LIBS = -lm
OBJS = main.o haha.o sin_value.o cos_value.o
CFLAGS = -Wall
main: ${OBJS}
        gcc -o $@ ${OBJS} ${LIBS}  # $@ 就是 main
clean:
        rm -f main ${OBJS}

Tarball管理

从源代码的说明我们知道制作一个二进制程序需要很多东西,这包括下面这些基础的软件。

  • gcc或cc等C语言编译器
  • make及autoconfig等软件
  • 需要内核提供的Library以及相关的include文件

Tarball安装的基本步骤

以 Tarball 方式发布的软件是源代码的形式,需要经过编译成二进制程序才能运行。所以,我们需要先将 Tarball 文件解压缩,得到源代码文件,然后在源代码所在的目录下建立一个 Makefile 文件,这个文件会告诉计算机如何编译和安装这个软件,最后使用 make 命令进行编译和安装操作,生成可执行的二进制程序。

所以整个安装的基础操作如下:

  1. 获取原始文件:首先需要从网上下载一个.tar.gz 或 .tar.bz2 格式的压缩文件,然后将它解压缩到 /usr/local/src 目录下。

  2. 获取步骤流程:进入解压后的目录,查看里面的一些重要文件,比如 INSTALL 和 README,这些文件会告诉你需要安装哪些依赖的软件。

  3. 依赖属性软件安装:如果有依赖软件需要安装,那么就按照文件里的提示安装好依赖软件

  4. 建立makefile :使用一个名为 configure 或 config 的程序来检测操作环境,并生成一个名为 Makefile 的文件,这个文件会告诉编译器需要进行哪些操作,比如编译、链接等。

  5. 编译:用make这个程序,并使用该目录下的Makefile做为它1的参数配置文件,来进行make(编译或其他)的操作。

  6. 安装:使用 make install 命令来安装程序,这个命令会根据 Makefile 文件里的指令将程序安装到正确的路径。

image-20230529182343787

一般 Tarball 软件安装的建议事项

Linux发行版发布安装的软件大多是在 /usr 里面

而用户自行安装的软件则建议放置在 /usr/local 里面(这考虑到了管理用户所安装软件的便利性)

/usr/local/ 目录下的一些常见文件和文件夹:

  1. /usr/local/bin/:存放本地安装的可执行文件。
  2. /usr/local/include/:存放本地安装的头文件。
  3. /usr/local/lib/:存放本地安装的库文件。
  4. /usr/local/share/:存放本地安装的共享文件,例如文档、图像和音频文件等。
  5. /usr/local/src/:存放本地安装的源代码。
  6. /usr/local/etc/:存放本地安装的配置文件。
  7. /usr/local/man/:存放本地安装的 man 页面。

如果每个软件都选择安装在默认的路径下,也就是 /usr/local/ 目录下,那么所有软件的文件都会被放置在同样的四个目录中,即 /bin、/include、/lib 和 /share 目录中。因此,如果你在这个目录下安装了很多软件,那么在未来想要升级或删除这些软件时,可能会比较难以追查每个文件的来源。而如果你再安装的时候选择的是单独的目录,例如我将apache安装再 /usr/local/apache当中,那么你的文件目录就会变成

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

因为单个软件的所有文件都被安装在同一个目录下,所以要删除这个软件就比较容易,只需要将这个目录删除即可。比如,如果要删除 Apache 这个软件,只需要执行命令【rm -rf /usr/local/apache】即可。但是,在实际安装软件的时候,还需要查看该软件的 Makefile 文件中的安装信息,才能了解该软件的具体安装情况。因为有些软件可能会在其他目录下安装一些文件,如果不了解具体情况就直接删除目录,可能会遗漏掉某些文件,导致软件无法正常卸载或者出现问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/493453.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

三轴工作台激光焊接机:实现高精度、高效率焊接的新选择

三轴工作台激光焊接机是一种先进的焊接设备&#xff0c;结合了激光焊接技术与三轴工作台的运动控制&#xff0c;实现了焊接过程的高效、精准与自动化。这种设备主要利用激光束的高能量密度和高速度特性&#xff0c;使工件在熔化的同时快速冷却凝固&#xff0c;从而达到高质量的…

AXI Memory Mapped to PCI Express学习笔记(一)——PCIe事务

1 PCIe事务 AXI事务对于PCIe来说&#xff0c;主要涉及到在AXI总线和PCIe总线之间进行数据交换和通信的过程。在PCIe系统中&#xff0c;AXI总线作为一个连接不同组件的桥梁&#xff0c;可以实现高效的数据传输和事务处理。 AXI事务通常包括读事务和写事务。在读事务中&#xf…

Git的使用记录+坑的处理

上学期也使用过git拉取gitee的项目进行远程办公,但是因为那个项目太赶,所以没有记录是如何使用的. 现在这个项目需要拉取gitlab上面的资源,于是再次使用了git,就记录一下基本操作和一些问题. 1.基本命令 git clone <repository-url> [<repository-url>代表远程仓库…

Java中锁的分类

引言 在多线程并发编程场景中,锁作为一种至关重要的同步工具,承担着协调多个线程对共享资源访问秩序的任务。其核心作用在于确保在特定时间段内,仅有一个线程能够对资源进行访问或修改操作,从而有效地保护数据的完整性和一致性。锁作为一种底层的安全构件,有力地防止了竞…

Qt开发(2)——在已有VS项目中配置Qt

在之前的Qt开发学习中&#xff0c;基本都是在Qt Creator中创建一个Qt项目&#xff0c;或者即便是在VS中也是直接新建一个Qt项目。但很少有记录如何在已有的C项目中添加Qt,这就好比我有个项目已经开发完了&#xff0c;现在又说加个Qt界面的功能。这篇文章就是记录如何在已有项目…

Programming Abstractions in C阅读笔记:p338-p346

《Programming Abstractions in C》学习第80天&#xff0c;p338-p346&#xff0c;总计9页。 一、技术总结 栈的实现包括入栈、出栈、判断栈是否为满&#xff0c;判断栈是否为空等。作者结合RPN计算器来实现&#xff0c;稍显无聊。 /** File: rpncalc.c* ---------------* Th…

VMware和Xshell连接

1.开启虚拟机 2.使用管理员账户&#xff0c;点击未列出 3.输入用户名密码 4.点击编辑虚拟网络编辑器 5.记住自己的网关和IP地址 6.打开终端 7.输入命令&#xff0c;vim / etc / sysconfig / network -scripts / ifcfg-ens33 回车 8.修改图中两处按“ I ”键进入编辑 d…

号码采集协议讲解

仅供学习研究交流使用 需要的进去拿源码或者成品

k8s1.28.8版本安装prometheus并持久化数据

本文参考 [k8s安装prometheus并持久化数据_/prometheus-config-reloader:-CSDN博客](https://blog.csdn.net/vic_qxz/article/details/119598466)前置要求: 已经部署了NFS或者其他存储的K8s集群. 这里注意networkpolicies网络策略问题&#xff0c;可以后面删除这个策略&#x…

Mysql连接查询

目录 一、连接查询 1.1内连接 1.2 左连接 1.3 右连接 二、存储过程 2.1 简介 2.2 优点 2.3语法 2.4 创建与调用存储过程 ​编辑2.4.1 查看存储过程 2.5 存储过程的参数 2.6 删除存储过程 一、连接查询 MySQL 的连接查询&#xff0c;通常都是将来自两个或多个表的记录…

如何利用nginx在windows系统上搭建一个文件服务器

1&#xff1a;先下载windows版的nginx 官网 http://nginx.org/ 下载完后注意端口号&#xff08;默认端口号为&#xff1a;80&#xff09;是否被占用 启动nginx服务 地址为localhost的 如果出现 Welcome to nginx 就说明启动成功 2&#xff1a;然后进入conf文件里修改配置 …

Mysql数据库——高级SQL语句补充

目录 一、子查询——Subquery 1.环境准备 2.In——查询已知的值的数据记录 2.1子查询——Insert 2.2子查询——Update 2.3子查询——Delete 3.Not In——表示否定&#xff0c;不在子查询的结果集里 3.Exists——判断查询结果集是否为空 4.子查询——别名 二、视图—…

GPIO端口的BSRR的使用

BSRR 只写寄存器 既能控制管脚为高电平&#xff0c;也能控制管脚为低电平。对寄存器高 16bit 写1 对应管脚为低电平&#xff0c;对寄存器低16bit写1对应管脚为高电平。写 0 ,无动作 首先看GPIOC的定义 接着看这个类型的定义 可以看到BSRR为无符号的32位的整形 接下来看GPIO_Pi…

【旅游】泉州攻略v1.0.0

一、泉州古城 泉州市距离深圳大约520公里&#xff0c;从深圳北站出发&#xff0c;高铁大约3小时30分。 到达泉州西站后&#xff0c;往东南方向大约8公里&#xff0c;就可以到达主要的旅游景点泉州古城。 古城很适合使用一天玩耍&#xff0c;核心路线如下&#xff1a; 一路的景…

python安装与使用

1安装 1.0下载 从官网下载安装包欢迎来到 Python.orghttps://www.python.org/ 1.1安装 双击安装包 将 图中选项勾选 之后如图 在点击 等待安装&#xff0c;安装之后关闭&#xff08;Close&#xff09; 2实现第一个python程序 2.0打开python运行环境 安装之后在开始菜单…

8.HelloWorld小案例

文章目录 一、Java程序开发运行流程如何理解编译&#xff1f; 二、HelloWorld案例的编写1、新建文本文档文件&#xff0c;修改名称为HelloWorld.java。2、用记事本打开HelloWorld.java文件&#xff0c;输写程序内容。代码要跟我编写的完全保持一致。3、ctrl s 保存&#xff0c…

【Java程序设计】【C00389】基于(JavaWeb)Springboot的校园疫情防控系统(有论文)

基于&#xff08;JavaWeb&#xff09;Springboot的校园疫情防控系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业六年&#xff0c;已经做了六年的毕业设计程序开发&#xff0c;开发过…

【C++】用哈希桶模拟实现unordered_set和unordered_map

目录 一、哈希介绍1.1 哈希概念1.2 哈希冲突解决1.2.1 闭散列1.2.2 开散列 二、哈希桶2.1 实现哈希桶2.1.1 构造节点和声明成员变量2.1.2 构造与析构2.1.3 仿函数2.1.4 查找2.1.5 插入2.1.6 删除 2.2 kv模型哈希桶源代码 三、改造哈希桶3.1 beginend3.2 迭代器3.2.1 前置 3.3 改…

【C语言】strcmp 的使⽤和模拟实现

前言 这篇文章将要带我们去实现模拟一个strcmp函数 首先我们要知道strcmp函数的定义 strcmp()定义和用法 我们先看一下strcmp在cplusplus网站中的定义 链接: link int strcmp ( const char * str1, const char * str2 );比较两个字符串将 C 字符串 str1 与 C 字符串 str2 …

pin脚的缺陷检测

忍不住 我才是最大的缺陷首先应该学好表达头脑风暴分割paddledetection小目标检测也不行缺陷检测1.缺陷标注修改代码为自己的数据集训练训练结果结果图片 结论再次出发 我才是最大的缺陷 真的&#xff0c;我真的被整无语了。测测测测&#xff0c;测个鬼。一天天的净整些没用的…