通过命令查看操作系统版本信息:
[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
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.0” make: *** [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的文件。