加入收藏 | 设为首页 | 会员中心 | 我要投稿 我爱制作网_沈阳站长网 (https://www.024zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

一、一般编 译开源库代码生成流程

发布时间:2022-12-21 11:28:27 所属栏目:Linux 来源:
导读:  Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后再安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解
  Linux环境下的软件安装,并不是一件容易的事情;如果通过源代码编译后再安装,当然事情就更为复杂一些;现在安装各种软件的教程都非常普遍;但万变不离其中,对基础知识的扎实掌握,安装各种软件的问题就迎刃而解了。
 
  一、一般编译开源库代码生成流程
 
  1、使用如下命令查看当前是否安装了gcc编译器,没有可以先用yum安装gcc
 
  gcc --version #查看是否安装gcc
 
  2、解压源码包,例如:
 
  tar -xvf nginx-1.7.7.tar.gz #解压源码包
 
  3、进入解压好的源码包:
 
  cd nginx-1.7.7 #进入源码包
 
  4、执行configure文件,此文件有两个功能:1、让用户选定编译特性;2、检查编译环境。configure执行后将生成MakeFile文件。例如:
 
  ./configure --prefix=/usr/local/nginx --conf-path=/etc/nginx/nginx.conf
 
  其中我们通过--prefix制定了安装路径,通过--conf-path制定了配置文件的具体位置。注意:不是所有的程序的configure参数都是一样的 可以使用 ./configure --help查看详细参数说明。如果该程序所依赖的库在当前系统中没有安装,则会导致configure最后报错,遇到这种情况就需要你先安装依赖库。
 
  如果是生产静态库或者动态库,则下面的操作不一样。同时,在交叉编译时,上面configure配置也是不一样的。
 
  5、执行make命令,编译程序
 
  make
 
  6、编译成功后就可以安装了,执行如下命令
 
  make install
 
  到此程序就算安装完成了,但是不要忘了还有后续的配置。
 
  二、Linux开源库的configure文件
 
  configure它是个shell脚本,主要用于编译安装源代码库和软件。 ./configure是源代码安装的第一步,主要的作用是对即将安装的软件进行配置,比如加上 –with、–enable、–without、–disable 等等参数对编译加以控制,检查当前的环境是否满足要安装软件的依赖关系,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC。生成makefile文件,以便你可以用make和make install来编译和安装程序,最后运行make clean删除一些临时文件。
 
  1、可以通过命令查看 就可以查看到所有的配置选项
 
  ./configure --help
 
  2、一般常用的配置如下
 
  命令配置
 
  含义
 
  备注
 
  --host=HOST
 
  指定软件运行的系统平台.如果没有指定,将会运行`config.guess'来检测.--host 指定的是交叉编译工具链的前缀。
 
  --build=BUILD
 
  指定软件包安装的系统平台,如当前我们是在intel的pentium机器中编译该系统,那么我们的--build就可能
 
  是i686-pc-linux-gnulinux软件源,.如果没有指定,默认值将是'--host'选项的值。
 
  --enable-FEATURE[=ARG]
 
  相反的,一些软件包可能提供了一些默认被禁止的特性,可以使用'--enable-FEATURE'来起用它.这里'FEATURE'是特性的名字.一个特性可能会接受一个可选的参数.例如:
 
  ./configure --enable-buffers=128
 
  --enable-FEATURE=no
 
  与--disable-FEATURE'是同义的.例如
 
  --enable-static:生成静态链接库
 
  --enable-shared:生成动态链接库
 
  注意生产的库文件可能在隐藏文件夹下你没有发现
 
  --prefix=PREFIX
 
  把软件安装到指定目录,例如
 
  ./configure--prefix=/opt/mlterm
 
  参考网址:
 
  三、如何生成configure文件
 
  autoscan: 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。
 
  aclocal:根据已经安装的宏,用户定义宏和acinclude.m4文件中的宏将configure.ac文件所需要的宏集中定义到文件 aclocal.m4中。aclocal是一个perl 脚本程序,它的定义是:“aclocal - create aclocal.m4 by scanning configure.ac”
 
  automake:将Makefile.am中定义的结构建立Makefile.in,然后configure脚本将生成的Makefile.in文件转换 为Makefile。如果在configure.ac中定义了一些特殊的宏,比如AC_PROG_LIBTOOL,它会调用libtoolize,否则它 会自己产生config.guess和config.sub。automake -a选项可以补齐文件config.guess,config.sub,install-sh,missing,depcomp。
 
  autoconf:将configure.ac中的宏展开,生成configure脚本。这个过程可能要用到aclocal.m4中定义的宏。
 
  111
 
  执行步骤如下:
 
  $ sudo apt install automake autoconf
  $ autoscan
  $ mv configure.scan configure.ac
  $ aclocal
  $ autoconf
  $ autoheader
  $ automake --add-missing
  $ ./configure
  $ make
  需要注意的举例文件如下:
 
  1、Makefile.am
 
  Makefile.am是一种比Makefile更高层次的编译规则,可以和configure.in文件一起通过调用automake命令,生成Makefile.in文件,再调用./configure的时候,就将Makefile.in文件自动生成Makefile文件了。所以Makefile.am文件是比Makefile文件更高的抽象。如下为此次举例的文件内容。
 
  里面也可以决定是否是生产什么样的文件,是可执行文件还是静态库或者动态库。
 
  AUTOMAKE_OPTIONS=foreign
  bin_PROGRAMS=hello
  hello_SOURCES=hello.cpp hello.h
  参考网址:
 
  2、configure.ac
 
  configure.ac由一些宏组成(如果已经有源代码,你可以运行autoscan来产生一个configure.scan文件,在此基础修改成configure.ac将更加方便),最基本的组成可以是下面的。
 
  #                                               -*- Autoconf -*-
  # Process this file with autoconf to produce a configure script.
  AC_PREREQ([2.69])
  AC_INIT(hello, 1.0, [email?protected])
  AM_INIT_AUTOMAKE(hello, 1.0)
  AC_CONFIG_SRCDIR([hello.cpp])
  AC_CONFIG_HEADERS([config.h])
  # Checks for programs.
  AC_PROG_CXX
  AC_PROG_CC
  # Checks for libraries.
  # Checks for header files.
  # Checks for typedefs, structures, and compiler characteristics.
  # Checks for library functions.
  AC_OUTPUT(Makefile)
  参考网址:
 
  3、举例源码文件
 
  /*hello.c*/
  #include
  #include "hello.h"
  using namespace std;
  int main()
  {
      CHello a;
      return 0;
  }
  /*hello.h*/
  #ifndef __HELLO_H__
  #define __HELLO_H__
  #include
  using namespace std;
  class CHello
  {
  public:
      CHello(){ cout<<"Hello!"<
 

(编辑:我爱制作网_沈阳站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!