几种常用库在CentOS下的编译

1操作环境

  通过命令查看操作系统版本信息:

[root@localhost ~]# cat /proc/version
Linux version 3.10.0-327.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) ) #1 SMP Thu Nov 19 22:10:57 UTC 2015

  查看当前操作系统发行版本信息:

[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 7.2.1511 (Core) 

  我的操作系统上没有安装gcc(这是按照我这种办法来安装gcc的前提),从操作系统安装镜像中取出需要的rpm包来安装gcc(此部分转载自:https://www.cnblogs.com/sybblogs/p/5717392.html),我的操作系统发行版本是CentOS 7.2.1511,从http://vault.centos.org/找到我的对应我的操作系统的镜像,所需要的rpm都放在了一个叫做packages的目录下,最终能取到我所需要的包的完整URL是:http://vault.centos.org/7.2.1511/os/x86_64/Packages/   。这个目录下有非常多的包,你可以使用快捷键Ctrl+F来查找你需要的包。

  接下里在你的操作系统上创建一个目录,用来在使用wget命令下载rpm包的时候保存下载下来的文件。使用这种方式需要如下包:

mpfr-3.1.1-4.el7.x86_64.rpm
libmpc-1.0.1-3.el7.x86_64.rpm
kernel-headers-3.10.0-327.el7.x86_64.rpm
glibc-headers-2.17-105.el7.x86_64.rpm
glibc-devel-2.17-105.el7.x86_64.rpm
cpp-4.8.5-4.el7.x86_64.rpm
gcc-4.8.5-4.el7.x86_64.rpm
gcc-c++-4.8.5-4.el7.x86_64.rpm

  所有这些包都下载好以后,按照如下顺序安装这些包:

rpm -ivh mpfr-3.1.1-4.el7.x86_64.rpm
rpm -ivh libmpc-1.0.1-3.el7.x86_64.rpm
rpm -ivh kernel-headers-3.10.0-327.el7.x86_64.rpm
rpm -ivh glibc-headers-2.17-105.el7.x86_64.rpm
rpm -ivh glibc-devel-2.17-55.el7.x86_64.rpm
rpm -ivh cpp-4.8.5-4.el7.x86_64.rpm
rpm -ivh gcc-4.8.5-4.el7.x86_64.rpm

  或者也可以如下命令统一安装:

rpm -Uvh *.rpm --nodeps --force

  安装结束之后,使用gcc -v 来查看gcc的版本以及使用g++ --version查看g++的版本(当然是4.8.5咯)

[root@localhost gcc]# g++ --version
g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
Copyright © 2015 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。

  卸载系统自带的python以及重新安装。

  卸载时依次执行以下几条命令:

[root@test ~]# rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps ##强制删除已安装程序及其关联
[root@test ~]# whereis python |xargs rm -frv ##删除所有残余文件 ##xargs,允许你对输出执行其他某些命令
[root@test ~]# whereis python ##验证删除,返回无结果

  创建目录用以保存python相关的包:

mkdir /usr/local/src/python

  进入该目录,并使用wget命令下载如下包:

python-2.7.5-34.el7.x86_64.rpm
python-iniparse-0.4-9.el7.noarch.rpm
python-pycurl-7.19.0-17.el7.x86_64.rpm
python-devel-2.7.5-34.el7.x86_64.rpm
python-libs-2.7.5-34.el7.x86_64.rpm
python-urlgrabber-3.10-7.el7.noarch.rpm
rpm-python-4.11.3-17.el7.x86_64.rpm

  创建目录保存yum的相关包:

mkdir /usr/local/src/yum

  使用wget命令下载下列包,保存到刚创建好的yum目录下:

yum-3.4.3-132.el7.centos.0.1.noarch.rpm
yum-metadata-parser-1.1.4-10.el7.x86_64.rpm
yum-plugin-fastestmirror-1.1.31-34.el7.noarch.rpm
(前三个是必须的,大多数帖子上都只有前三个)

  安装python,yum的安装依赖python。

  安装Python的命令:(在目录/usr/local/src/python  就是刚才保存了python相关包的目录,下执行这条命令)

rpm -Uvh --replacepkgs python*.rpm

  安装结束后,在终端输入python,即可看到python的版本信息。

  安装Yum的命令:(把刚才下载好的yum相关的包也移动到/usr/local/src/python目录下,然后再执行这条指令):

rpm -Uvh --replacepkgs rpm-python*.rpm yum*.rpm

  OK,至此,yum就安装完成了,可以在终端输入yum来验证一下。 

注:如果使用wget下载的时候提示域名解析失败,可以执行命令 vim /etc/resolv.conf(这个是DNS服务器配置配置文件) ,在文件中添加如下几行:

nameserver 127.0.0.1
nameserver 8.8.8.8
nameserver 114.114.114.114

 一.ocilib库的编译

 1.简介

  源码下载地址:https://github.com/vrogier/ocilib/releases/。本次编译下载的版本是:V4.6.0(Source Code(tar.gz))。这个库的使用还需要用到oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm(这是在Oracle官网上下载的,我博客另一篇帖子里有说怎么安装Oracle的客户端,只要按照讲的操作把这个rpm包也安装好即可)。

  C/C++访问数据库的主要方式有四种:ADO、ODBC、PRO*C、OCI,ADO和ODBC是通用方法,编程简单但是速度相对较慢。OCI和PRO*C是Oracle公司提供的专门的开发工具,访问速度很快,适合实时性要求较高的工程。OCI即Oracle call interface,是Oracle提供的一个C接口,它访问速度快但是接口众多,编程复杂。OCILIB则是对OCI的封装,接口相对简单,适合快速编程。

  使用OCILIB库,首先要安装Oracle客户端:oracle-instanclient,它提供了客户端代码库(libclntsh.so.11.1)和Oracle C++调用接口库(libocci.so.11.1)

2.生成makefile文件

  使用tar -zxf ocilib4.6.0.tar.gz 解压后得到目录 ocilib4.6.0,进入该目录,在bash中输入 ./configure 直接执行的话,会提示找不到头文件。

checking for Oracle home... defined by environment : /usr/lib/oracle/11.2/client64
checking for Oracle OCI headers location... configure: error: variable not set or unable to guess

   正确的输入办法应该是(总算找到一个可以用的了):

./configure --with-oracle-lib-path=/usr/lib/oracle/11.2/client64/lib --with-oracle-headers-path=/usr/include/oracle/11.2/client64 CFLAGS="-O2 -m64"

  上面的输入语句,其中with是用来指定ocilib所需要的头文件和库文件的位置,CFLAGS="-O2 -m64" 的意思是生成的是64位的库,整个命令的作用是生成makefile文件,为下一步的编译做准备。

3.make

  这是linux的一个命令(或者你把它认为是工具程序也可以,目标就是解析makefile文件,并执行其中的规则),使用make来编译源码。

  但是我使用了make之后,提示错误,原因我想应该是生成makefile文件在编译array.c的时候没有加-std=c99这个参数。

[root@localhost ocilib-4.6.0]# make
make  all-recursive
make[1]: 进入目录“/root/CppProject/OpenSourceLibrary/ocilib-4.6.0”
Making all in doc/html
make[2]: 进入目录“/root/CppProject/OpenSourceLibrary/ocilib-4.6.0/doc/html”
make[2]: 对“all”无需做任何事。
make[2]: 离开目录“/root/CppProject/OpenSourceLibrary/ocilib-4.6.0/doc/html”
Making all in src
make[2]: 进入目录“/root/CppProject/OpenSourceLibrary/ocilib-4.6.0/src”
/bin/sh ../libtool  --tag=CC   --mode=compile gcc -DHAVE_CONFIG_H -I. -I..  -I/usr/include/oracle/11.2/client64 -I../include  -DOCI_IMPORT_LINKAGE -DOCI_CHARSET_ANSI   -O2 -m64 -MT libocilib_la-array.lo -MD -MP -MF .deps/libocilib_la-array.Tpo -c -o libocilib_la-array.lo `test -f 'array.c' || echo './'`array.c
libtool: compile:  gcc -DHAVE_CONFIG_H -I. -I.. -I/usr/include/oracle/11.2/client64 -I../include -DOCI_IMPORT_LINKAGE -DOCI_CHARSET_ANSI -O2 -m64 -MT libocilib_la-array.lo -MD -MP -MF .deps/libocilib_la-array.Tpo -c array.c  -fPIC -DPIC -o .libs/libocilib_la-array.o
array.c: 在函数‘OCI_ArrayInit’中:
array.c:59:5: 错误:只允许在 C99 模式下使用‘for’循环初始化声明
     for (unsigned int i = 0; i < arr->nb_elem; i++)
     ^
array.c:59:5: 附注:使用 -std=c99 或 -std=gnu99 来编译您的代码
array.c: 在函数‘OCI_ArrayClose’中:
array.c:151:9: 错误:只允许在 C99 模式下使用‘for’循环初始化声明
         for (unsigned int i = 0; i < arr->nb_elem; i++)
         ^
make[2]: *** [libocilib_la-array.lo] 错误 1
make[2]: 离开目录“/root/CppProject/OpenSourceLibrary/ocilib-4.6.0/src”
make[1]: *** [all-recursive] 错误 1
make[1]: 离开目录“/root/CppProject/OpenSourceLibrary/ocilib-4.6.0make: *** [all] 错误 2

  查了一下,在makefile中也没找到对应的规则,闲着没事打开INSTALL文件看了一下,发现了这个问题的解决办法。

[root@localhost ocilib-4.6.0]# ls
aclocal.m4   ChangeLog  config.h.in    configure     demo     images   libtool  Makefile     NEWS          proj       README.MD  src       THANKS
acocilib.m4  config     config.log     configure.ac  doc      include  LICENSE  Makefile.am  ocilib.pc     README     reconf     stamp-h1  VERSION
AUTHORS      config.h   config.status  COPYING       doxygen  INSTALL  m4       Makefile.in  ocilib.pc.in  README.in  scripts    tests

  好了,按照INSTALL给出的建议,重新写./configure的执行参数。

./configure --with-oracle-lib-path=/usr/lib/oracle/11.2/client64/lib --with-oracle-headers-path=/usr/include/oracle/11.2/client64 CC=c99 CFLAGS="-g -O2 -m64" --prefix=/root/CppProject/include/ocilib/ --exec-prefix=/root/CppProject/library/ocilib/

  CFLAGS 这里填写的是编译器选项,-g表示编译为debug版本,-O2,优化等级为2,-m64,表示这是64位的程序库,CC=c99,表示用gcc编译的时候编译命令里加上 -cc=c99这个参数。我想要的是C++版本动态

4.安装 make install

  在终端中输入make install命令即可,这样它会把编译好的头文件和库文件放到你在configure脚本执行过程中--prefix 和 --exe-prefix参数指定的目录中。

 

补充:

  在有的机器上执行make的时候可能会遇到这样的问题(事实上,我在虚拟机上安装了操作系统,从github上克隆了代码,就碰到了):

WARNING: 'aclocal-1.15' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>

  这个会导致make失败。查看了一下我的automake版本是1.13,所以问题就是没满足它的要求的1.15版本了。查看当前automake版本的命令是:automake --version

  解决办法:

  1.下载安装包:automake-1.15.tar.gz

wget https://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz

  2.解压

tar -zxvf automake-1.15.tar.gz

  3.配置

./configure --prefix=/usr

  4.make & 安装

make 
make install

  上述4步做完之后,在转到ocilib源码所在目录执行make命令即可。

二、Google Glog在linux下的编译

  源代码下载地址:https://github.com/google/glog

git clone https://github.com/google/glog.git

  有很多个release版本,可以使用git tag查看所有的版本,所谓tag就是指给对应的commit对象起的别名。所以可以使用git checkout切换到你想要的版本,我使用比我写这篇博客时老一个版本的源码编译。切换版本(更新的版本需要先执行脚本autogen.sh,作用是生成configure脚本):

git checkout v0.3.4

  然后进入glog目录,执行脚本configure,configuer的参数可以参考编译ocilib时给定的参数,这样可以指定make install指定的安装路径。CXXFLAGS指定带调试符号。

./configure --prefix=/home/CppProject/include/glog --exec-prefix=/home/CppProject/library/glog CXX=g++ CXXFLAGS="-g"

  这时候可能会报错,因为v0.3.4版本,要求automake的版本是1.14。可以按照上一节讲的更新为automake1.15的办法更新为1.14版本。更新好之后,执行make命令,可能还会报错,具体错误是缺少"test_driver”,解决办法:

automake --add-missing

  它会自动安装缺少的东西,接下来再执行make就没有问题了,然后make install。

make install

 

 

三、tinyxml2在linux下的编译

  源码下载地址:https://github.com/leethomason/tinyxml2

  编译过程:这里只有makefile的prefix = /home/centos/CppProject/include/tinyxml2这一行需要改一下(这是头文件所在的位置,库和测试程序的保存位置则跟lib和bin这两个变量有关系),它关系到你在执行命令:make install的时候将头文件,还有生成的静态库都保存到了什么地方。如果要在编译的库中添加调试符号,只要把CXXFLAGS = -fPIC 改成 CXXFLAGS = -g -fPIC。

  改好了之后,只要执行make和make install命令就可以。

四、librdkafka在linux下的编译

  下载源代码:https://github.com/edenhill/librdkafka

  配置:运行configure

./configure --prefix=/home/CppProject/include/librdkafka --exec-prefix=/home/CppProject/library/librdkafka --CPPFLAGS="-g"

  然后接下来的就是make 和make install了。这样编译出来的是带调试符号的。

  configure时,--prefix指定的安装目录,也就是make install时它会把编译好的文件(头文件和库文件生成到你指定了目录下)。C++开发的话,使用的是:librdkafka++.so 。

五、Google protocol buffer 在linux下的编译

    源码下载地址:https://github.com/protocolbuffers/protobuf.git

  进入到protobuf目录下,有个叫configure的文件。

 

 

 

 

 

posted on 2019-01-14 18:02  古I月  阅读(636)  评论(0编辑  收藏  举报

导航