返回总目录页

编译安装

 

编译概念

编译(compilation , compile) 1、利用编译程序从源语言编写的源程序产生目标程序的过程。 2、用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。 编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析语法分析;语义检查和中间代码生成代码优化目标代码生成。主要是进行词法分析语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。
编译语言是一种以编译器来实现的编程语言。它不像直译语言一样,由解释器将代码一句一句运行,而是以编译器,先将代码编译为机器码,再加以运行。理论上,任何编程语言都可以是编译式,或直译式的。它们之间的区别,仅与程序的应用有关。

 来源于 :https://baike.baidu.com/item/%E7%BC%96%E8%AF%91/1258343?fr=aladdin

编译的基本流程

编译可以分为五个基本步骤:词法分析、语法分析、语义分析中间代码的生成、优化、目标代码的生成。这是每个编译器都必须的基本步骤和流程, 从源头输入高级语言源程序输出目标语言代码。 [2] 

来源于:https://baike.baidu.com/item/%E7%BC%96%E8%AF%91%E5%8E%9F%E7%90%86/4194?fr=aladdin

程序包编译

	程序包编译安装:
		Application-VERSION-release.src.rpm -->  安装后,使用 rpmbuild 命令制作成二进制格式的rpm 包,而后再安装源代码--> 预处理--> 编译--> 汇编--> 链接--> 执行.

	源代码组织格式:
		多文件:	文件中的代码之间,很可能存在跨文件依赖关系
		C 、C++ :	make 项目管理器,configure脚本 --> Makefile.in --> Makefile
		java: 	maven

编译安装

	C 语言源代码编译安装三步骤:
		1。./configure
			(1) 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定,以及makefile.in 文件生成makefile
			(2) 检查依赖到的外部环境,如依赖的软件包
		2。make(项目编辑器):
			根据makefile 文件,构建应用程序
			为了加快编译速度,可以采用这条命令make -j 4 && make install。-j表示可以多进程,多线程的并发编译。
			如果处理器数量为4个,-j最多写4。
		3。make install:
			复制文件到相应路径
	
	开发工具:
		同时开发者也可以自己生成 configure。使用autoconf生成configure脚本,使用automake生成Makefile.in。
		autoconf:生成configure 脚本
		automake:生成Makefile.in
	
	注意:
		安装前查看INSTALL ,README
	
	开源程序源代码的获取:
		官方自建站点:
			apache.org (ASF :Apache Software Foundation)
			mariadb.org
			...
		代码托管:
			SourceForge.net
			Github.com
			code.google.com
	
	c/c++ 编译器: 
		gcc (GNU C Complier)
	
	编译C源代码:
		准备:	提供开发工具及开发环境
		开发工具:	make(项目编辑器), gcc等
		开发环境:	开发库,头文件
		glibc :	标准库
		实现:	通过“包组”提供开发组件,Development Tools ,Server Platform Development
		
		
	第一步:configure 脚本
		选项:指定安装位置、指定启用的特性
			--help:  获取其支持使用的选项
		选项分类:
			安装路径设定:
				--prefix=/PATH:  指定默认安装位置, 默认为/usr/local/
				--sysconfdir=/PATH :配置文件安装位置
				
		
			System types: 支持交叉编译
	
			Optional Features:  可选特性
				--disable-FEATURE
				--enable-FEATURE[=ARG]
	
			Optional Packages:  可选包
				--with-PACKAGE[=ARG], 依赖包
				--without-PACKAGE, 禁用依赖关系
	
	第二步:make(项目编辑器)
	
	第三步:make install
	
	安装后的配置:
		(1)  二进制程序目录导入至PATH 环境变量中,编辑文件/etc/profile.d/NAME.sh,export PATH=/PATH/TO/BIN:$PATH
		
		(2)  导入库文件路径(不用做)。
			编辑/etc/ld.so.conf.d/NAME.conf,添加新的库文件所在目录至此文件中,让系统重新生成缓存:
			ldconfig [-v]
			
		(3)  导入头文件(不用做)
			基于链接的方式实现:
				ln -sv
		
		(4)  导入帮助手册
			编辑/etc/man.config|man_db.conf 文件
				添加一个MANPATH

原文链接:https://www.cnblogs.com/shenxm/p/8403751.html

 

5分钟理解make/makefile/cmake/nmake

 

最近,有没有被make、cmake、makefile... ... 这些东西绕晕了,看看下面的文章,也许就可以理解清楚了。

1. gcc

它是GNU Compiler Collection(就是GNU编译器套件),也可以简单认为是编译器,它可以编译很多种编程语言(括C、C++、Objective-C、Fortran、Java等等)。

我们的程序只有一个源文件时,直接就可以用gcc命令编译它。

可是,如果我们的程序包含很多个源文件时,该咋整?用gcc命令逐个去编译时,就发现很容易混乱而且工作量大,所以出现了下面make工具。

2. make

make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。

3. makefile

这个是啥东西?

简单的说就像一首歌的乐谱,make工具就像指挥家,指挥家根据乐谱指挥整个乐团怎么样演奏,make工具就根据makefile中的命令进行编译和链接的。makefile命令中就包含了调用gcc(也可以是别的编译器)去编译某个源文件的命令。

makefile在一些简单的工程完全可以人工拿下,但是当工程非常大的时候,手写makefile也是非常麻烦的,如果换了个平台makefile又要重新修改,这时候就出现了下面的Cmake这个工具。

4. cmake

cmake就可以更加简单的生成makefile文件给上面那个make用。当然cmake还有其他更牛X功能,就是可以跨平台生成对应平台能用的makefile,我们就不用再自己去修改了。

可是cmake根据什么生成makefile呢?它又要根据一个叫CMakeLists.txt文件(学名:组态档)去生成makefile。

5. CMakeList.txt

到最后CMakeLists.txt文件谁写啊?亲,是你自己手写的。

6. nmake[1]

nmake又是啥东西?

nmake是Microsoft Visual Studio中的附带命令,需要安装VS,实际上可以说相当于linux的make,明白了么?

根据上面总结一下大体流程:[2]

1.用编辑器编写源代码,如.c文件。

2.用编译器编译代码生成目标文件,如.o。

3.用链接器连接目标代码生成可执行文件,如.exe。

但如果源文件太多,一个一个编译那得多麻烦啊?于是人们想到,为啥不设计一种类似批处理的程序,来批处理编译源文件呢?

于是就有了make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译。但是你需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的技能。

对于一个大工程,编写makefile实在是件复杂的事,于是人们又想,为什么不设计一个工具,读入所有源文件之后,自动生成makefile呢,于是就出现了cmake工具,它能够输出各种各样的makefile或者project文件,从而帮助程序员减轻负担。但是随之而来也就是编写cmakelist文件,它是cmake所依据的规则。(cmake中有很多设置库的,此时还不是可执行文件,而make生成后才是二进制可执行文件。)

所以在编程的世界里没有捷径可走,还是要脚踏实地的。

原文链接:https://zhuanlan.zhihu.com/p/111110992?from_voters_page=true

 

 

一、编译安装概述

 

前面两篇关于程序包管理器的文章谈到,无论是使用rpm命令还是yum命令安装的都是已编译好的程序包,在整个安装过程中用户只需执行一条命令即可完成安装。这样带来的好处是方便,但因为是安装的是已编译好的包,所以用户的系统平台环境必须与rpm包制作者的系统平台环境相同。此外,如果用户要安装使用某程序上的某个功能,而rpm包制作者在编译过程中默认没有指定该功能的实现,这时候该怎么办呢?更何况如果某程序只是提供源码而没有现成的rpm包。这时就需要用户手动编译安装了,而编译安装就是将程序源代码编译成完全适合自己平台类型的程序包。

 

因此,用户首先得获得程序源码包(SRPM, Source RPM)。RPM包的命名格式为:name-VERSION-release.arch.rpm,而程序源码包(SRPM)的命名格式为:name-VERSION-release.src.rpm。可以发现,SRPM与RPM相比,将arch替换为src,说明SRPM包去掉了arch这一平台类型限制,因此经过用户自己编译安装可以编译成适合自己平台的程序包。

 

以下为编译过程图解(以C源代码为例):

我们知道,程序源代码一般为多文件组织格式,因此文件中的代码文件之间很有可能存在跨文件的依赖关系,这将给用户自行编译安装带来了极大麻烦,因为对先编译哪些文件、后编译哪些文件根本无从知晓,因此这就需要项目管理器(或者项目构建器)了。C/C++的项目管理器为make,make工具可以在编译过程中指定使用哪个预处理器进行预处理、使用哪个编译器进行编译以及先编译什么程序文件、后编译什么程序文件,甚至完成更为复杂的操作等,能帮助用户快速地编译安装。make工具的执行依赖于makefile配置文档,因此make执行的所有操作皆由makefile指定。makefile可由执行configure脚本生成。而在执行configure脚本时,configure会结合用户通过命令行指定的选项以及各个Makefile.in模板文件来生成makefile文件。编译完成之后即可使用make install命令将编译好的程序包复制到用户指定的各个目录下。

 

 

二、C代码编译安装三步骤

 

(1) 执行configure脚本(# ./configure [option...])

常用选项:

--help:获得其支持使用的选项
--prefix=/PATH/TO/SOMEWHERE:指定默认安装位置;默认为/usr/local/;
--sysconfdir=/PATH/TO/SOMEWHERE:配置文件安装位置;
--enable-FEATURE[=ARG]:开启指定特性以及安装路径;默认开启时无须指定;
--disable-FEATURE:关闭指定特性;默认关闭时无须指定;
--with-PACKAGE[=ARG]:安装指定依赖包以及其安装路径;
--without-PACKAGE:不安装指定依赖包;

 

执行configure脚本的作用:

①用户可以通过选项传递参数给configure脚本,以指定启用的功能特性、安装路径等;而configure脚本在执行的过程中会参考用户的指定以及Makefile.in文件生成makefile文件;

②检查程序指定要启用的功能特性所依赖到的外部环境。

 

(2) 执行make程序

作用:

make会执行真正的编译操作,但make本身并不是编译器,它只是一个项目构建工具,make程序会根据执行configure脚本所生成的makefile文件,并调用所需要用到的编译器来构建应用程序。

 

(3) 执行make install安装操作

作用:

在前面的make程序执行之后,在当前目录下会创建出已编译完成的目标二进制格式的应用程序(包括二进制程序、库文件、配置文件及帮助文档等),而make install则会执行安装操作,即把当前目录下已编译好的程序包(二进制程序、库文件、配置文件及帮助文档等)复制到用户指定的各个目录下。

 

注意:各个程序在编译安装过程中可能不尽相同,因此建议安装前查看INSTALL, README。

 

 

三、编译安装后的配置

 

(1) 导出目标二进制程序目录至PATH环境变量中

方法:

在生产环境中如果该二进制程序作为全局变量,可以在/etc/profile.d/目录下创建/etc/profile.d/NAME.d文件,其中"NAME"可定义设置名称。在该文件中写入下面一行:

export PATH=PATH:/PATH/TO/BIN

这里的/PATH/TO/BIN即为目标二进制程序所在目录。

如果要想编译后的命令程序优先被查找到,可以添加在环境变量PATH的前面,如下:

export PATH=/PATH/TO/BIN:PATH

 

(2) 导出库文件路径

方法:

①在/etc/ld.so.conf.d/目录下创建/etc/ld.so.conf.d/NAME.conf,其中NAME为自定义设置名称。而后,添加新的库文件所在目录至此文件中即可。

②做完这一步之后,需要让系统重新加载库文件(重新生成缓存):

# ldconfig [-v]

 

查看当前系统上已加载的库文件:

# ldconfig -p

 

(3) 导出头文件(位于include目录)

程序编译安装完成之后,一般在安装路径中会有include目录,这个include目录就是头文件,头文件的功能是把外部文件的内容包含到源文件中,例如外部函数等。在程序开始编译之前,会执行一段预处理指令,而预处理指令则把头文件的内容包含到源文件中。

如果要导出头文件,可基于软链接的方式来实现:

# ln -sv  头文件目录  链接头文件目录(/usr/include/NAME)

这里链接头文件目录一般为/usr/include/NAME,其中NAME可以是程序名,例如/usr/include/httpd。

 

(4) 导出帮助手册

方法:

在CentOS 6上:

编辑/etc/man.config文件,添加一个MANPATH:

# MANPATH /PATH/TO/MAN

这里"/PATH/TO/MAN"为目标程序的安装路径下的帮助手册目录。

 

在CentOS 7上:

编辑/etc/man_db.conf文件,添加一个MANPATH:

# MANPATH_MAP /PATH/TO/BIN    /PATH/TO/MAN

这里/PATH/TO/BIN是目标二进制程序所在目录,/PATH/TO/MAN则是该程序的帮助手册所在目录。

 

 

 

本文出自 “Tab” 博客,请务必保留此出处http://xuweitao.blog.51cto.com/11761672/1905357

原文地址:http://xuweitao.blog.51cto.com/11761672/1905357

 

Nginx编译安装详情

 请点击: Nginx多种安装方式

 

某次安装编译工具报错glibc-devel的解决过程

[root@mcwxxxxxxx-4 /etc/yum.repos.d]#  yum install gcc
......
--> Finished Dependency Resolution
Error: Package: gcc-4.8.5-44.el7.x86_64 (mcwself)
           Requires: glibc-devel >= 2.2.90-12
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
[root@mcwxxxxxxx-4 /etc/yum.repos.d]#  yum install glibc-devel
--> Finished Dependency Resolution
Error: Package: glibc-headers-2.17-325.el7_9.x86_64 (mcw2self)
           Requires: kernel-headers >= 2.2.1
Error: Package: glibc-headers-2.17-325.el7_9.x86_64 (mcw2self)
           Requires: kernel-headers
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest
[root@mcwxxxxxxx-4 /etc/yum.repos.d]#  rpm -qa|grep kernel-headers
[root@mcwxxxxxxx-4 /etc/yum.repos.d]#  cd /home/machangwei/
[root@mcwxxxxxxx-4 /home/machangwei]#  rpm -ivh kernel-headers-3.10.0-1160.45.1.el7.x86_64.rpm 
warning: kernel-headers-3.10.0-1160.45.1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing...                          ################################# [100%]
Updating / installing...
   1:kernel-headers-3.10.0-1160.45.1.e################################# [100%]
[root@mcwxxxxxxx-4 /home/machangwei]#   yum install glibc-devel
[root@mcwxxxxxxx-4 /home/machangwei]#   yum install gcc gcc-c++
Installed:
  gcc.x86_64 0:4.8.5-44.el7                                                             gcc-c++.x86_64 0:4.8.5-44.el7                                           

Dependency Installed:
  cpp.x86_64 0:4.8.5-44.el7               libmpc.x86_64 0:1.0.1-3.el7               libstdc++-devel.x86_64 0:4.8.5-44.el7               mpfr.x86_64 0:3.1.1-4.el

Dependency Updated:
  libgcc.x86_64 0:4.8.5-44.el7                             libgomp.x86_64 0:4.8.5-44.el7                             libstdc++.x86_64 0:4.8.5-44.el7       
[root@mcwxxxxxxx-4 /home/machangwei]#  rpm -qa|egrep "gcc|gcc-c++|make" 
gcc-c++-4.8.5-44.el7.x86_64
make-3.82-24.el7.x86_64
gcc-4.8.5-44.el7.x86_64
libgcc-4.8.5-44.el7.x86_64


这次安装总共装了这些包:gcc|gcc-c++|make|glibc-devel|kernel-headers

 

编译安装的是可以迁移其它目录和主机的

如果是编译安装的python和 sqlite等,编译安装指定某个目录后,直接打包目录,不只是能跨主机,也是能跨目录的,不是非要在编译安装的目录才能使用

比如下面这个,python3和sqlite都是编译安装到/opt目录下的,但是直接打包放到别的目录或者别的主机,照样可以运行程序

 详情点击 这里

 

 

 

是否

 

posted @ 2021-11-01 19:03  马昌伟  阅读(956)  评论(0编辑  收藏  举报
博主链接地址:https://www.cnblogs.com/machangwei-8/