linux学习-linux下软件编译安装

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux学习-linux下软件编译安装相关的知识,希望对你有一定的参考价值。

由于计算机无法直接执行高级语言编写的源程序,如果需要运行程序,就需要使用一种机制来让计算机识别,这样程序才可能运行起来。一般来说,计算机中存在解释型语言和编译型语言。解释性语言就是计算机逐条取出源码中文件的指令,将其转化为机器指令,并执行这个指令的过程。而编译型语言是指在程序运行前就将所有大源代码一次性转化为机器代码,在运行这个程序的过程。

可执行程序工作原理

ELF目标文件格式

所谓目标文件,指编译器生成的文件。目标指的是目标平台,如x86或者x64,它决定了编译器使用的机器指令集。目标文件一般也叫做ABI,Application Binary Interface,应用程序二进制接口。最古老的目标文件格式是a.out,,后来发展为COFF格式,现在常用的格式有PE(windows)和ELF(linux)。

ELF( Executable and Linkable Format),可执行和可连接的格式,是一种目标文件格式的标准。

ELF 有三种类型。

  • 可重定位文件

一般是中间文件,有编译器和汇编器创建。一个源码文件会生成一个重定位文件。该文件保存代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件、静态库、或者共享目标文件。

  • 可执行文件

一般由多个可重定位文件结合生成,是完成了所有定位工作和符号解析的文件,保存一个用来执行的程序。

  • 共享目标文件

共享库,是指可以被可执行文件或者其他库文件使用的目标文件,​​例如C的库文件libc.so​​。so代表share object.

ELF文件参与程序的连接和执行程序。

程序编译

程序从源代码到可执行为文件的步骤。

  • 预处理
gcc -E hello.c -o hello.i
  • 编译
gcc -S hello.i -o hello.s -m32
  • 汇编
gcc -c hello.s -o hello.o -m32
  • 链接
gcc hello,o -o hello -m32 -static


预处理

预处理的作用

  • 删除所有的注释 //和/**/
  • 删除所有的#define,咱开所有的宏含义
  • 处理所有的条件预编译指令
  • 处理#include预编译指令,将被包含的文件插入该预编译指令的位置
  • 添加行号和文件号标识

预处理完的文件仍然是文本文件,可以用任意编辑工具打开查看,


编译

编译的时候,gcc首先要检查代码的规范性,是否有语法错误。以确定代码实际要的工作。在检查无误后,gcc把代码翻译成汇编语言

gcc -S hello.i -o hello.s -m32

-S 只编译而不汇编,只生成汇编代码,不进一步翻译为机器指令

-m32 生成32位平台格式文件

编译完成的文件任然是文本文件,可以用任意编辑器查看。

汇编

汇编后形成的o格式的文件已经是ELF格式文件了。

链接

链接时将各种代码和数据部分收集起来合并组合成一个单一文件的过程,这个文件可以被加载或者复制到内存中执行,


编译、安装、打印HelloWord程序

直接编译运行

编写如下c语言格式的文件

vim HelloWorld.c

#include <stdio.h>
int main(void)
printf ("Hello,world\\n");
return 0;

有了源码文件,就能使用gcc工具将源码编译为一个可执行文件,

 gcc HelloWorld.c -o HelloWorld

可以采用如下三种方法执行该可执行程序

#使用./执行或者全路径执行
./HelloWorld

#将Hellowrold复制到任意path变量保安的目录中
cp HelloWorld /bin/
HelloWorld #直接执行

#将目录追加到 PATH变量中
export PATH=$PATH:/root/
lloWorld #直接执行

以上就是源码编译安装的基本原理,总结就是 写源代码->编译源码生成二进制可执行文件->复制文件到保存PATH

Makefile、make命令

在实际工作中,软件的需求往往比较复杂,大多是基于模块化的思想来实现,所以一个软件需要多个源码编译出某个模块文件之后,才能最终编译并生成主程序。为了方便软件安装,使用makefile简化整个过程。

一般makefile都是软件开发人员编写好了的,运维基本拿来使用即可。

 makefile基本概念

  • 规则的三个要素:目标、依赖、命令

linux学习-linux下软件编译安装_目标文件


有了makefile之后,使用make命令执行编译安装。以下是make命令语法:

linux学习-linux下软件编译安装_目标文件_02

使用makefile 安装HelloWorld

编写makefile文件

#vim Makefile
HelloWorld:HelloWorld.o
gcc -o HelloWorld HelloWorld.c
install:
cp HelloWorld /bin/

 按照如下安装

make #完成编译
make install #完成软件复制

linux学习-linux下软件编译安装_可执行文件_03


一般,很多开源软件自身是不包括makefile的,特别是在模块化较高的软件的中,都不包含makefile。此时一般都是用configure工具来生成用户需要的makefile.

典型的源码编译安装的过程如下:

  • 运行configure命令,结合必要的参数生成makefile
  • 运行make命令生成各类型的模块和主程序
  • 运行make install命令将必要的文件复制到安装目录中


以上是关于linux学习-linux下软件编译安装的主要内容,如果未能解决你的问题,请参考以下文章

Linux平台下安装MySQL

Linux下软件的安装与管理

linux学习笔记十一:srpm软件包(*.src.rpm)的安装

linux编译安装完软件比如说tar.gz格式的,家目录下解压后的包可以删除吗?

Ubuntu Linux下安装软件方法

linux下软件编译出错