软件安装流程

前面软件篇提到了通过 RPM 和 YUM 在线安装的机制安装软件,除了这两种方式之外还有一种通过源码来安装软件的方式。
 
如上流程图所示,程序员使用特定语言(c/c++/...)编写源文件,通过编译器翻译成机器可以执行的可执行文件,也就是二进制文件。其中,如果源文件依赖函数库的话,在编译的时候还需要将相应的函数库给链接上。
 
 
走一遍操作的流程看看程序是怎么从源文件到可执行文件的。
编写源文件 hello.cpp 和 thanks.cpp,其中 hello.cpp 引用 thanks.cpp 的函数:
[root@lianhua tarball]$ cat hello.cpp
#include <stdio.h>
#include "thanks.h" int main(void)
{
printf("Hello World\n");
thanks(); return 0;
}
[root@lianhua tarball]$ cat thanks.cpp
#include <stdio.h> int thanks(void)
{
printf("thanks lianhua, I love you\n"); return 0;
}
[root@lianhua tarball]$ cat thanks.h
int thanks();
 
源文件有了,使用 Liunx 自带的 c/c++ 编译器 gcc 编译源文件:
[root@lianhua tarball]$ gcc -c hello.cpp
[root@lianhua tarball]$ ll
total 16
-rw-r--r-- 1 root root 117 May 10 22:44 hello.cpp
-rw-r--r-- 1 root root 1560 May 10 22:45 hello.o
-rw-r--r-- 1 root root 80 May 10 22:45 thanks.cpp
-rw-r--r-- 1 root root 14 May 10 22:44 thanks.h
[root@lianhua tarball]$ gcc -o hello hello.o
hello.o: In function `main':
hello.cpp:(.text+0xf): undefined reference to `thanks()'
collect2: error: ld returned 1 exit status
 
报错,显示函数 thanks 没定义。出错原因是因为 hello.cpp 引用到了该函数,但是编译的时候没有链接,所以对症下药:
[root@lianhua tarball]$ gcc -c hello.cpp thanks.cpp
[root@lianhua tarball]$ ll
total 20
-rw-r--r-- 1 root root 117 May 10 22:44 hello.cpp
-rw-r--r-- 1 root root 1560 May 10 22:46 hello.o
-rw-r--r-- 1 root root 100 May 10 22:46 thanks.cpp
-rw-r--r-- 1 root root 14 May 10 22:44 thanks.h
-rw-r--r-- 1 root root 1520 May 10 22:46 thanks.o
[root@lianhua tarball]$ gcc -o hello hello.o thanks.o
[root@lianhua tarball]$ ll
total 32
-rwxr-xr-x 1 root root 8552 May 10 22:47 hello
-rw-r--r-- 1 root root 117 May 10 22:44 hello.cpp
-rw-r--r-- 1 root root 1560 May 10 22:46 hello.o
-rw-r--r-- 1 root root 100 May 10 22:46 thanks.cpp
-rw-r--r-- 1 root root 14 May 10 22:44 thanks.h
-rw-r--r-- 1 root root 1520 May 10 22:46 thanks.o
[root@lianhua tarball]$ file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=1801febeffa3328a578dac21ee994dd50893ed3f, not stripped
[root@lianhua tarball]$ ./hello
Hello World
thanks lianhua, I love you
 
可以看到,将 thanks.cpp 编译成目标文件 thanks.o,然后链接到该目标文件生成了可执行的二进制文件 hello。其中,file 命令可以判断文件是二进制文件或一般文本文件。
 
 
这是一种生成可执行文件的方式,还有一种提供函数库给编译器编译的方式。
函数库分两种静态函数库和动态函数库,静态函数库在编译的时候被放到可执行文件中,动态函数库在编译的时候会创建“指针”指向该动态函数库。所以,使用静态函数库的可执行文件要比使用动态函数库的可执行文件大。但是基于静态函数库的可执行文件在编译完之后就不依赖于库,放到哪都可以执行,基于动态函数库的可执行文件则不行,它需要能引用到该动态函数库。

静态函数库的可执行文件

[root@lianhua tarball]$ ar rcs liblianhua.a thanks.o
[root@lianhua tarball]$ ll
total 36
...
-rw-r--r-- 1 root root 1668 May 10 23:09 liblianhua.a
[root@lianhua tarball]$ gcc hello.cpp -llianhua -L/root/hxia/tarball
[root@lianhua tarball]$ gcc hello.cpp -llianhua -L/root/hxia/tarball -o lianhua
[root@lianhua tarball]$ ll
total 60
-rwxr-xr-x 1 root root 8552 May 10 22:47 hello
-rw-r--r-- 1 root root 117 May 10 22:44 hello.cpp
-rw-r--r-- 1 root root 1560 May 10 22:46 hello.o
-rwxr-xr-x 1 root root 8552 May 10 23:11 lianhua
-rw-r--r-- 1 root root 1668 May 10 23:09 liblianhua.a
-rw-r--r-- 1 root root 100 May 10 22:46 thanks.cpp
-rw-r--r-- 1 root root 14 May 10 22:44 thanks.h
-rw-r--r-- 1 root root 1520 May 10 22:46 thanks.o
[root@lianhua tarball]$ ./lianhua
Hello World
thanks lianhua, I love you
 
通过 ar 命令将 thanks.o 生成为 lianhua 的静态函数库,编译器链接该静态函数库生成可执行的二进制文件 lianhua。其中,静态函数库以 .a 结尾,动态函数库以 .so 结尾。

动态函数库的可执行文件

[root@lianhua shared]$ gcc -fPIC -shared thanks.cpp -o liblianhua.so
[root@lianhua shared]$ ll
total 20
-rw-r--r-- 1 root root 117 May 10 23:18 hello.cpp
-rwxr-xr-x 1 root root 8112 May 10 23:20 liblianhua.so
-rw-r--r-- 1 root root 100 May 10 23:18 thanks.cpp
-rw-r--r-- 1 root root 14 May 10 23:18 thanks.h
[root@lianhua shared]$ gcc hello.cpp -L. -llianhua -o hello
[root@lianhua shared]$ ll
total 32
-rwxr-xr-x 1 root root 8528 May 10 23:21 hello
-rw-r--r-- 1 root root 117 May 10 23:18 hello.cpp
-rwxr-xr-x 1 root root 8112 May 10 23:20 liblianhua.so
-rw-r--r-- 1 root root 100 May 10 23:18 thanks.cpp
-rw-r--r-- 1 root root 14 May 10 23:18 thanks.h
[root@lianhua shared]$ ./hello
./hello: error while loading shared libraries: liblianhua.so: cannot open shared object file: No such file or directory
 
命令 gcc -fPIC -shared 将 thanks.cpp 编译成动态函数库 lianhua,生成可执行文件 hello。但是,在执行 hello 的时候报错了,提示找不到 lianhua 这个动态函数库。错误原因是动态链接时默认从 /usr/lib 目录下找动态函数库,将 lianhua 拷到该目录下,更新配置:
[root@lianhua shared]$ cp libthanks.so /usr/lib/
[root@lianhua shared]$ vi /etc/ld.so.conf
[root@lianhua shared]$ ldconfig
[root@lianhua shared]$ ./hello
Hello World
thanks lianhua, I love you
 
ldconfig 命令将动态函数库从硬盘加载到内存中,这样执行可执行文件的时候执行引用内存中的动态函数库,速度会快很多。
 
Liunx 的 ldd 命令可以查看可执行文件引用了哪些动态函数库:
[root@lianhua tarball]$ ldd hello
linux-vdso.so.1 => (0x00007ffcc9bec000)
libc.so.6 => /lib64/libc.so.6 (0x00007f4175126000)
/lib64/ld-linux-x86-64.so.2 (0x00007f41754f3000)
[root@lianhua tarball]$ ldd ./shared/hello
linux-vdso.so.1 => (0x00007fff7d9da000)
libthanks.so => /lib/libthanks.so (0x00007f6896b53000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6896786000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6896d55000)
可以发现基于动态函数库的 hello 指向了 thanks 这个库。同时,比较两个可执行文件大小也会发现基于静态函数库的可执行文件 hello 要比基于动态函数库的可执行文件要大。
 
 
想象下,这是只有一个函数的编译情况,在实际项目中有成百上千上万个函数,各个函数分布在不同的目录这时候在用这种 gcc 指定函数库编译的方式就特别不适用了。
在这种情况下,会写 cmake 文件定义编译规则,每个目录下都有 cmake 文件。再执行 cmake 命令生成 makefile 文件,然后通过 make 命令就能根据 makefile 中的规则编译生成可执行文件。
 
具体这个流程实操不介绍了,有兴趣的看看这个文档
 
 
 
(完)
 

每天学五分钟 Liunx 1000 | 软件篇:源码安装的更多相关文章

  1. Linux一些常用软件的源码安装

    Sreen: wget ftp://ftp.gnu.org/pub/gnu/screen/screen-4.0.3.tar.gz .tar.gz cd screen- ./configure make ...

  2. 【程序包管理】Linux软件管理之src源码安装编译

    在很多时候我们需要自定义软件的特性,这时就需要用到源码安装.那么,网上有很多编译源码的工具,那么,我们怎么知道别人使用的是什么工具呢.其实我也不知道(*^▽^*). 那么本篇博客主要是写C代码的源码安 ...

  3. salt源码安装软件和yum安装软件

    上面简单列出了源码安装的sls文件书写思路. 涉及到一些固定的思路:如, 1,拷贝 解压安装时候需要依赖tar.gz存在 如果已安装则无需再次安装. 2,启动脚本 加入chk时候需要文件存在,如果已添 ...

  4. 搭建LNAMP环境(五)- PHP7源码安装Redis和Redis拓展

    上一篇:搭建LNAMP环境(四)- 源码安装PHP7 一.安装Redis 1.创建redis用户组和用户 groupadd redis useradd -r -g redis -s /sbin/nol ...

  5. linux下源码安装软件

    在linux下的很多软件都是通过源码包方式发布的,这样做对于最终用户而言,虽然相对于二进制软件包,配置和编译起来繁琐点,但是它的可移植性却好得多,针对不同的体系结构,软件开发者往往仅需发布同一份源码包 ...

  6. Linux源码安装软件

    Linux环境下 源码编译安装软件 ==== 1. 下载,步骤略 ==== 2. 验证,部分官方下载同时提供签名,MD5,sha1,sha256等校验信息. $ gpg --verify gnupg- ...

  7. Android必学-异步加载+Android自定义View源码【申明:来源于网络】

    Android必学-异步加载+Android自定义View源码[申明:来源于网络] 异步加载地址:http://download.csdn.net/detail/u013792369/8867609 ...

  8. linux操作之软件安装(二)(源码安装)

    源码安装 linux上的软件大部分都是c语言开发的 , 那么安装需要gcc编译程序才可以进行源码安装. yum install -y gcc #先安装gcc 安装源码需要三个步骤 1) ./confi ...

  9. [svc]salt源码安装软件和yum安装软件

    上面简单列出了源码安装的sls文件书写思路. 涉及到一些固定的思路:如, 1,拷贝 解压安装时候需要依赖tar.gz存在 如果已安装则无需再次安装. 2,启动脚本 加入chk时候需要文件存在,如果已添 ...

  10. Linux 之 软件安装-yum、rpm、源码安装

    软件安装-yum.rpm.源码安装 参考教程:[千峰教育] 一.Yum安装软件: 基本说明: 1.yum相当于windows上面的360的软件中心,appstore,安卓的应用商店. 2.yum是re ...

随机推荐

  1. UMP系统概述

    突出性能: 1.低成本,高性能    2.开源数据库 UMP在设计时要实现一下原则: 多租户:

  2. 启发式搜索(heuristic search)———A*算法

    在宽度优先和深度优先搜索里面,我们都是根据搜索的顺序依次进行搜索,可以称为盲目搜索,搜索效率非常低. 而启发式搜索则大大提高了搜索效率,由这两张图可以看出它们的差别: (左图类似与盲搜,右图为启发式搜 ...

  3. 数字孪生与GIS的结合:创新灾害预防管理的未来

    近年来,全球频发的自然灾害给人们的生命和财产安全带来了巨大威胁,灾害预防管理成为当务之急.然而,随着数字孪生技术和GIS的迅猛发展,一种全新的解决方案正在崭露头角.数字孪生与GIS的结合,为灾害预防管 ...

  4. 23年底,我出齐了Spring boot,Spring cloud和案例方面的书,正在写一本面试书(代年终总结)

    年末了,再来总结一下吧,希望本人明年的年终总结文还能在博客园发. 这次总结的主题是本人出的java书.这几年本人出了不少书,其中有python.redis和Java方面的. 姑且不说其它,java方面 ...

  5. Socket.D 替代 Http 协议像 Ajax 一样开发前端接口

    我们在"前端接口"开发时,使用 socket.d 协议有什么好处: 功能上可以替代 http 和原生 ws 更安全!现有的工具想抓包数据,难!难!难!(socket.d 是个新的二 ...

  6. 《RAPL: A Relation-Aware Prototype Learning Approach for Few-Shot Document-Level Relation Extraction》阅读笔记

    代码   原文地址   预备知识: 1.什么是元学习(Meta Learning)? 元学习或者叫做"学会学习"(Learning to learn),它是要"学会如何学 ...

  7. 文心一言 VS 讯飞星火 VS chatgpt (37)-- 算法导论5.4 1题

    一.一个屋子里必须要有多少人,才能让某人和你生日相同的概率至少为1/2? 必须要有多少人,才能让至少两个人生日为 7月 4 日的概率大于 1/2? 文心一言: 一个屋子里必须要有多少人,才能让某人和你 ...

  8. 4大焕新,华为云CCE带你感受容器化上云体验

    本文分享自华为云社区<华为云CCE邀您共同打造最佳容器化上云体验>,作者:云容器大未来 . 在容器化日益成为中大型企业上云主流选择的情况下,容器服务如何能帮助用户更简单快捷的上云.高效可信 ...

  9. 一文带你认识MindSpore新一代分子模拟库SPONGE

    [本期推荐专题]物联网从业人员必读:华为云专家为你详细解读LiteOS各模块开发及其实现原理. 摘要:基于MindSpore自动并行.图算融合等特性,SPONGE可高效地完成传统分子模拟过程,利用Mi ...

  10. Vuex在TSX中的改造方案:TS改造Vue2项目Vuex如何处置?

    vuex目前比较流行的有:vuex-aggregate . vuex-class.vuex-module-decorators npm搜到相关的,看下趋势图:https://www.npmtrends ...