Linux开发环境第三方库规划

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Linux开发环境第三方库规划.pdf 【本文目的】 让工作变得有条理,不乱糟糟,即使存在大量的第三方,也有章可循。简而言之,就是要保持目录的干净(如/usr/local目录),保持文件的干净(如profile文件) 【安装目录建议】 1...
img_e25d4fb2f8de1caf41a735ec53088516.pngLinux开发环境第三方库规划.pdf

【本文目的】

让工作变得有条理,不乱糟糟,即使存在大量的第三方,也有章可循。简而言之,就是要保持目录的干净(如/usr/local目录),保持文件的干净(如profile文件)

【安装目录建议】

1)       如果是多人共享的,可考虑在/usr/local目录下建立子目录thirdparty,不太建议直接放在/usr/local目录下,那会显得有些凌乱,也不便于整体打包复制到其它机器;

2)       如果/usr/local所在分区不够大,则可考虑软链接方式,或者直接在其它目录下建立子目录thirdparty

3)       如果只是自己独自使用的,则可以考虑在$HOME下建立子目录thirdparty;

4)       同样如果$HOME所在分区不够,可以考虑软连接方式或在其它目录下建立thirdparty

【问题思考】

第三方按使用性质可分为三类:

1)       仅代码中会使用到的第三方库,如libevent

2)       工具型,代码中不会使用到的,如automake

3)       综合型,即是工具,同时代码中也会使用到的,如MySQL

 

是否需要对它们分开对待,还是同等对待?

/etc/profile文件】

# thirdparty-HOME

export THIRDPARTY_HOME=/usr/local/thirdparty

# thirdparty-PATH

export PATH=$THIRDPARTY_HOME/m4/bin:$PATH

export PATH=$THIRDPARTY_HOME/automake/bin:$PATH

export PATH=$THIRDPARTY_HOME/autoconf/bin:$PATH

export PATH=$THIRDPARTY_HOME/cmake/bin:$PATH

export PATH=$THIRDPARTY_HOME/bison/bin:$PATH

export PATH=$THIRDPARTY_HOME/valgrind/bin:$PATH

export PATH=$THIRDPARTY_HOME/subversion/bin:$PATH

export PATH=$THIRDPARTY_HOME/openssl/bin:$PATH

export PATH=$THIRDPARTY_HOME/thrift/bin:$PATH

export PATH=$THIRDPARTY_HOME/sqlite/bin:$PATH

# thirdparty-MANPATH

export MANPATH=$THIRDPARTY_HOME/m4/share/man:$MANPATH

export MANPATH=$THIRDPARTY_HOME/autoconf/share/man:$MANPATH

export MANPATH=$THIRDPARTY_HOME/automake/share/man:$MANPATH

export MANPATH=$THIRDPARTY_HOME/cmake/share/man:$MANPATH

export MANPATH=$THIRDPARTY_HOME/bison/share/man:$MANPATH

export MANPATH=$THIRDPARTY_HOME/valgrind/share/man:$MANPATH

export MANPATH=$THIRDPARTY_HOME/subversion/share/man:$MANPATH

export MANPATH=$THIRDPARTY_HOME/openssl/ssl/man:$MANPATH

export MANPATH=$THIRDPARTY_HOME/sqlite/share/man:$MANPATH

# thirdparty-LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$THIRDPARTY_HOME/subversion/lib:$LD_LIBRARY_PATH

【安装目录结构】

/usr/local/thirdparty# ls -l

total 60

lrwxrwxrwx 1 root root   13 2015-08-08 13:20 autoconf -> autoconf-2.69

drwxr-xr-x 4 root root 4096 2015-08-08 13:20 autoconf-2.69

lrwxrwxrwx 1 root root   13 2015-08-08 13:22 automake -> automake-1.15

drwxr-xr-x 4 root root 4096 2015-08-08 13:22 automake-1.15

lrwxrwxrwx 1 root root    9 2015-08-08 14:47 bison -> bison-3.0

drwxr-xr-x 5 root root 4096 2015-08-08 13:32 bison-3.0

lrwxrwxrwx 1 root root   12 2015-08-08 11:49 boost -> boost_1_57_0

drwxr-xr-x 4 root root 4096 2015-08-08 11:54 boost_1_57_0

lrwxrwxrwx 1 root root   11 2015-08-08 14:24 cmake -> cmake-3.2.2

drwxr-xr-x 5 root root 4096 2015-08-08 14:24 cmake-3.2.2

lrwxrwxrwx 1 root root   10 2015-08-08 12:07 glog -> glog-0.3.4

drwxr-xr-x 5 root root 4096 2015-08-08 12:07 glog-0.3.4

lrwxrwxrwx 1 root root   22 2015-08-08 11:34 libevent -> libevent-2.0.22-stable

drwxr-xr-x 5 root root 4096 2015-08-08 11:34 libevent-2.0.22-stable

lrwxrwxrwx 1 root root    9 2015-08-08 13:29 m4 -> m4-1.4.17

drwxr-xr-x 4 root root 4096 2015-08-08 13:29 m4-1.4.17

lrwxrwxrwx 1 root root   32 2014-08-08 12:04 mysql -> mysql-5.6.24-linux-glibc2.5-i686

drwxr-xr-x 4 root root 4096 2014-08-08 12:04 mysql-5.6.24-linux-glibc2.5-i686

lrwxrwxrwx 1 root root   14 2014-08-08 11:30 openssl -> openssl-1.0.2a

drwxr-xr-x 6 root root 4096 2014-08-08 11:23 openssl-1.0.2a

lrwxrwxrwx 1 root root   14 2014-08-08 12:18 protobuf -> protobuf-2.6.1

drwxr-xr-x 5 root root 4096 2014-08-08 12:18 protobuf-2.6.1

lrwxrwxrwx 1 root root   23 2014-08-08 12:11 sqlite -> sqlite-autoconf-3080803

drwxr-xr-x 6 root root 4096 2014-08-08 12:11 sqlite-autoconf-3080803

lrwxrwxrwx 1 root root   17 2014-08-08 14:47 subversion -> subversion-1.6.20

drwxr-xr-x 6 root root 4096 2014-03-27 14:16 subversion-1.6.20

lrwxrwxrwx 1 root root   12 2014-08-08 13:08 thrift -> thrift-0.9.2

drwxr-xr-x 5 root root 4096 2014-08-08 13:08 thrift-0.9.2

lrwxrwxrwx 1 root root   15 2014-08-08 11:09 valgrind -> valgrind-3.10.1

drwxr-xr-x 6 root root 4096 2014-08-08 11:08 valgrind-3.10.1

【第三方安装操作建议】

1)       如果多人共享,建议以root帐号安装;如果仅自己使用,则建议自己的帐号安装;

2)       安装目录建议带上版本号,如/usr/local/thirdparty/protobuf-2.6.1,在安装成功后再以不带版本号的名称做个软链接,如:cd /usr/local/thirdparty&&ln -s protobuf-2.6.1 protobuf

3)       如果是以root帐号安装的,则建议将环境变量添加到/etc/profile文件中;否则建议添加到用户自己的~/.profile~/.bashrc文件中;

4)       强烈建议环境变量的添加按/etc/profile文件】所示格式进行,这样多而不乱。

【第三方库目录结构】

对于开源的CC++第三库而言,多数使用automake编译,当前有些逐步改用cmake编译,如gflags改用了cmakethrift也开始引入了cmake

不管是以automake,还是以cmake,当make install安装后,它们的目录结构多数如下所示的形式:

/usr/local/thirdparty/glog

|-- include

|   `-- glog

|-- lib

`-- share

 

从上不难看出,对于include目录是一个ABA的结构,对于lib则是直接的AB结构。这样,在Makefile文件中指定CPPFLAGSLDFLAGS时,一般可标准化写法:

-I$THIRDPARTY/glog/include -L$THIRDPARTY/glog/lib -lglog

 

如果不符合这样的一个结构,建议修改成这样,一个重要原因是:非常强烈建议在代码中#include时包含第三方库名,如:#include ,这种做法可以减少文件名冲突,使用MySQL时就可能遇到这个问题。

 

但对于像protobuf这样的ABCA结构,则不用修改,但#include时需要将BC带入,如:#include google/protobuf/message.h>

 

MySQLSQLite3都不是标准的ABAABCA结构,因此需要调整一下。

Boost的编译和安装】

Boost既不是标准的automake编译安装,也不是cmake编译安装,它用的是自己独有的安装,多数情况下可使用如下两条命令编译和安装它:

1)       ./bootstrap.sh --without-icu --without-libraries=python,graph,graph_parallel,mpi,wave

2)       ./b2 install threading=multi --prefix=$THIRDPARTY_HOME/boost --without-python --without-graph --without-graph_parallel --without-mpi --without-wave

 

其中bootstrap.sh的目的是生成b2。,然后使用b2来编译安装Boost

OpenSSL的编译和安装】

OpenSSL也不是标准的automakecmake安装,它用的也是自己独有的安装,多数情况下建议如下步骤编译安装它:

1)       ./config --prefix=$THIRDPARTY_HOME/openssl shared threads

2) make depend # openssl-1.0.2h之前版不需要这一步
3)      
make

4)       make install

 

第一步config的作用类似于automakeconfigure,用于生成Makefile文件,之后就和automake一样操作。

Thrift的编译和安装】

0.9.2版本之前的Thrift,只支持标准的automake编译,但从0.9.2开始引入了cmake编译,两种方式共存。

如果OpenSSL不是被安装在默认的目录下(即没有指定--prefix时安装OpenSSL),则在编译Thrift时可能会遇到找不到OpenSSL,这个时候可按如下方式编译安装Thrift

./configure --prefix=$THIRDPARTY_HOME/thrift-0.9.2 \

            --with-boost=$THIRDPARTY_HOME/boost \

            --with-libevent=$THIRDPARTY_HOME/libevent \

            CPPFLAGS="-I$THIRDPARTY_HOME/openssl/include" \

            LDFLAGS="-ldl -L$THIRDPARTY_HOME/openssl/lib" \

            --with-qt4=no --with-c_glib=no --with-csharp=no \

            --with-erlang=no --with-perl=no --with-ruby=no --with-haskell=no \

            --with-go=no --with-d=no

 

不难看出,这里指定了CPPFLAGSLDFLAGS

MySQL的编译和安装】

一般情况下,不建议以源码方式安装MySQL

如果以通用的二进制tar包安装MySQL(如mysql-5.6.24-linux-glibc2.5-x86_64.tar.gz),则在解压它之后可找到名为INSTALL-BINARY的文件,这个文件即列出了安装步骤,虽然是E文的,但比较容易看懂。

解压tar安装包后,会看到includelib两个目录,它不符合前面所说的ABAABCA结构,建议按ABA的结构调整一下,以方便使用。

【后序】

从近来的一些趋势看,一些开源库正在逐步使用cmake替代automake,也许几年后成了清一色的cmake,而automake慢慢地被淘汰。

除了cmake外,其实还有其它选择,比如Google20153月开源的构建工具Bazelhttps://github.com/google/bazel)也是个不错的选择。微软公司在Bazel之前开源了自家构建工具MSBuildhttps://github.com/Microsoft/msbuild)。国内的腾讯公司更是在2011年就开源了大型构建工具Bladehttps://github.com/chen3feng/typhoon-blade)。

对于Linux平台上的C/C++开发者,建议去了解下BladeBazel,这工具上手不难,功能强大,易于使用,一旦用上就容易爱上。

 
安装openssl
# ./config --prefix=/usr/local/thirdparty/
openssl-1.0.2a shared threads


【安装httpd(apache),支持https】
# ./configure --with-apr=/usr/local/thirdparty/ apr-1.4.6 --with-apr-util=/usr/local/thirdparty/ apr-util-1.5.1 --with-ssl=/usr/local/thirdparty/ openssl-1.0.2a --with-pcre=/usr/local/thirdparty/ pcre-8.32 --prefix=/usr/local/ httpd-2.4.3 
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
Linux Shell
入职必会-开发环境搭建36-Linux常用操作-Linux环境变量
环境变量的作用是指定到哪个目录去找你输入的命令执行。环境变量的设置分为:临时设置和永久设置两种。
|
5月前
|
Oracle Java 关系型数据库
入职必会-开发环境搭建41-Linux软件安装-安装JDK
本文介绍了在Linux系统中下载和安装JDK
190 3
入职必会-开发环境搭建41-Linux软件安装-安装JDK
|
5月前
|
域名解析 网络协议 Linux
入职必会-开发环境搭建38-Linux常用操作-Linux设置IP
目前安装的Linux操作系统默认是动态获取IP地址,IP地址可能会发生变动,需要把IP地址设置为静态的。
入职必会-开发环境搭建38-Linux常用操作-Linux设置IP
|
5月前
|
网络协议 Linux 网络安全
入职必会-开发环境搭建39-Linux常用操作-Linux防火墙操作
在CentOS 7中,新引入了firewalld服务(防火墙),取代了CentOS 6之前的iptables服务(防火墙)。
入职必会-开发环境搭建39-Linux常用操作-Linux防火墙操作
|
5月前
|
Linux
入职必会-开发环境搭建37-Linux常用操作-Linux服务管理
系统启动以后一直存在且常驻内存没有界面的进程就是服务。Linux系统中的所有服务都保存在下列目录中:/usr/lib/systemd/system,进入该目录就能看到所有的服务。
入职必会-开发环境搭建37-Linux常用操作-Linux服务管理
|
5月前
|
应用服务中间件 Linux 网络安全
|
4月前
|
存储 监控 Ubuntu
在Linux中,如何规划⼀台 Linux 主机,步骤是怎样?
在Linux中,如何规划⼀台 Linux 主机,步骤是怎样?
|
5月前
|
应用服务中间件 Linux 网络安全
|
5月前
|
缓存 监控 Linux
入职必会-开发环境搭建40-Linux常用操作-Linux进程管理
进程是正在执行的程序或命令。每个进程独立的,都有需要占用一定的系统资源。Linux系统中启动进程有两种方式:1.Linux操作系统启动的时自动启动的进程。2.用户在终端输入命令启动的进程。
入职必会-开发环境搭建40-Linux常用操作-Linux进程管理
|
5月前
|
Unix 关系型数据库 Linux
入职必会-开发环境搭建35-Linux常用操作-Linux必会命令
使用Windows系统时用户通常是使用鼠标点击进行文件或文件夹的创建、删除等操作,在Linux系统中是通过敲命令来控制系统的,Windows系统和Linux系统的目录结构不同,我们需要先熟悉Linux系统的目录结构。
入职必会-开发环境搭建35-Linux常用操作-Linux必会命令