几种常用库在CentOS下的编译

摘要:
接下里在你的操作系统上创建一个目录,用来在使用wget命令下载rpm包的时候保存下载下来的文件。本软件没有任何担保;包括没有适销性和某一专用目的下的适用性担保。安装Python的命令:rpm-Uvh--replacepkgspython*.rpm安装结束后,在终端输入python,即可看到python的版本信息。 注:如果使用wget下载的时候提示域名解析失败,可以执行命令vim/etc/resolv.conf,在文件中添加如下几行:nameserver127.0.0.1nameserver8.8.8.8nameserver114.114.114.114一.ocilib库的编译 1.简介源码下载地址:https://github.com/vrogier/ocilib/releases/。这个库的使用还需要用到oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm。
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 © 2015Free 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 insrc
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.inconfigure     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 inorder 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的文件。

免责声明:文章转载自《几种常用库在CentOS下的编译》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Shell脚本中时间处理微信小程序通信录下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux的log日志功能

# cd /etc/init.d # ./syslog restart Shutting down kernel logger: OK ]Shutting down system logger: OK ]Starting system logger: OK ]Starting kernel logger: OK ] 不过最好查询清楚是为什么不能写入linu...

python使用stomp连接activemq

一、安装ActiveMQ服务 1. 当使用windows时,安装参考:https://blog.csdn.net/WuLex/article/details/78323811 启动:运行activemq.bat 2. 当使用linux时,安装参考:https://www.cnblogs.com/andylhc/p/9337628.html 启动:./act...

python库fire使用简介

简介 目前python命令行解析库用过的有:argparse(python自带)、click(Flask作者写的) 但二者相比fire这个库,用起来都不够 “简单”,fire一行代码能把函数导出到命令行窗口。 argparse用法示例 #arg_test.py importargparse def counter(file_type=None):...

ASP.NET Core 2.1 : 十四.静态文件与访问授权、防盗链(转)

ASP.NET Core 系列目录 我的网站的图片不想被公开浏览、下载、盗链怎么办?本文主要通过解读一下ASP.NET Core对于静态文件的处理方式的相关源码,来看一下为什么是wwwroot文件夹,如何修改或新增一个静态文件夹,为什么新增的文件夹名字不会被当做controller处理?访问授权怎么做?(ASP.NET Core 系列目录) 一、静态文件夹...

saltstack--史上最细致安装攻略!亲测无坑

准备一台虚拟机node1: [root@linux-node1 pillar]# ifconfig ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.88.137 netmask 255.255.255.0 broadcast 1...

GCC编译之后的代码信息

arm-none-eabi-gcc编译之后会显示一些信息,比如 下面就来说受每个字段的含义以及它们与bin文件大小的关系。text区是代码区,就是程序编译之后源码的区域,在烧录之后一直位于Flash ROM中。 data和bss都是指的全局变量以及函数内static的变量,区别是data是有初始值的而bss没有。data的初始值同样存在Rom里,当单片机启...