推荐: blog.csdn.net/aquester https://github.com/eyjian https://www.cnblogs.com/aquester http://blog.chinaunix.net/uid/20682147.html
全部博文(594)
分类: LINUX
2015-04-16 15:57:00
让工作变得有条理,不乱糟糟,即使存在大量的第三方,也有章可循。简而言之,就是要保持目录的干净(如/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。
是否需要对它们分开对待,还是同等对待?
# 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) 强烈建议环境变量的添加按所示格式进行,这样多而不乱。
对于开源的C和C++第三库而言,多数使用automake编译,当前有些逐步改用cmake编译,如gflags改用了cmake,thrift也开始引入了cmake。
不管是以automake,还是以cmake,当make install安装后,它们的目录结构多数如下所示的形式:
/usr/local/thirdparty/glog
|-- include
| `-- glog
|-- lib
`-- share
从上不难看出,对于include目录是一个ABA的结构,对于lib则是直接的AB结构。这样,在Makefile文件中指定CPPFLAGS和LDFLAGS时,一般可标准化写法:
-I$THIRDPARTY/glog/include -L$THIRDPARTY/glog/lib -lglog
如果不符合这样的一个结构,建议修改成这样,一个重要原因是:非常强烈建议在代码中#include时包含第三方库名,如:#include ,这种做法可以减少文件名冲突,使用MySQL时就可能遇到这个问题。
但对于像protobuf这样的ABCA结构,则不用修改,但#include时需要将B和C带入,如:#include <google/protobuf/message.h>。
像MySQL、SQLite3都不是标准的ABA和ABCA结构,因此需要调整一下。
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也不是标准的automake和cmake安装,它用的也是自己独有的安装,多数情况下建议如下步骤编译安装它:
1) ./config --prefix=$THIRDPARTY_HOME/openssl shared threads
2) make depend # openssl-1.0.2h之前版不需要这一步
3) make
4) make install
第一步config的作用类似于automake的configure,用于生成Makefile文件,之后就和automake一样操作。
在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
不难看出,这里指定了CPPFLAGS和LDFLAGS。
一般情况下,不建议以源码方式安装MySQL。
如果以通用的二进制tar包安装MySQL(如mysql-5.6.24-linux-glibc2.5-x86_64.tar.gz),则在解压它之后可找到名为INSTALL-BINARY的文件,这个文件即列出了安装步骤,虽然是E文的,但比较容易看懂。
解压tar安装包后,会看到include和lib两个目录,它不符合前面所说的ABA和ABCA结构,建议按ABA的结构调整一下,以方便使用。
从近来的一些趋势看,一些开源库正在逐步使用cmake替代automake,也许几年后成了清一色的cmake,而automake慢慢地被淘汰。
除了cmake外,其实还有其它选择,比如Google于2015年3月开源的构建工具Bazel()也是个不错的选择。微软公司在Bazel之前开源了自家构建工具MSBuild()。国内的腾讯公司更是在2011年就开源了大型构建工具Blade()。
对于Linux平台上的C/C++开发者,建议去了解下Blade和Bazel,这工具上手不难,功能强大,易于使用,一旦用上就容易爱上。
【安装openssl】
# ./config --prefix=/usr/local/thirdparty/openssl-1.0.2a shared threads
Aquester2015-08-21 10:24:05
thrift编译示例:
./configure --prefix=/usr/local/thirdparty/thrift-0.9.2 --with-boost=/usr/local/thirdparty/bst --with-libevent=/usr/local/thirdparty/libevent CPPFLAGS=\"-I/usr/local/thirdparty/openssl/include\" LDFLAGS=\"-ldl -L/usr/local/thirdparty/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