Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8169433
  • 博文数量: 595
  • 博客积分: 13065
  • 博客等级: 上将
  • 技术积分: 10334
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-26 16:44
个人简介

推荐: blog.csdn.net/aquester https://github.com/eyjian https://www.cnblogs.com/aquester http://blog.chinaunix.net/uid/20682147.html

文章分类

全部博文(595)

分类: LINUX

2015-04-16 15:57:00

Linux开发环境第三方库规划.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)       强烈建议环境变量的添加按所示格式进行,这样多而不乱。

【第三方库目录结构】

对于开源的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月开源的构建工具Bazel)也是个不错的选择。微软公司在Bazel之前开源了自家构建工具MSBuild)。国内的腾讯公司更是在2011年就开源了大型构建工具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 
阅读(3682) | 评论(5) | 转发(1) |
给主人留下些什么吧!~~

Aquester2017-08-09 15:37:04

\'__curl_rule_01__\' is negative
这个编译错误,是因为在64位平台上编译64位程序,但curl库是32位方式编译的。

Aquester2016-10-26 15:43:11

Aquester:编译openssl:./config --prefix=/usr/local/thirdparty/openssl-1.0.2i shared threads

编译openssl:
./config --prefix=/usr/local/openssl-1.1.0b shared threads

回复 | 举报

Aquester2016-09-23 11:44:26

编译openssl:./config --prefix=/usr/local/thirdparty/openssl-1.0.2i shared threads

Aquester2015-09-01 10:41:35

如果需要通过curl访问https,在编译curl时需要指定OpenSSL,如:
./configure --prefix=/usr/local/thirdparty/curl-7.42.1  --with-ssl=/usr/local/thirdparty/openssl

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