linux GCC环境,boost在编译时未加-fPIC参数,导致如果有共享库使用boost静态库,会报如下错误:
relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
如果使用automake编译,可以通过CPPFLAGS将-fPIC加进去。
针对boost_1_53_0版本,修改tools/build/v2/tools/gcc.jam,注释掉387行:
#if $(link) = shared
可以打开-fPIC
准备向boost提交这一BUG:
https://svn.boost.org/trac/boost/newticket注:这是默认规则,因为automake编译也不会针对静态库加-fPIC,如果是自己写automake,则可以在Makefile.am中加上:
AM_CXXFLAGS += -fPIC
如果是第三方库的,则使用CPPFLAGS传进去。
附:boost编译安装方法
说明:下面内容仅针对Linux环境(boost官网为:http://www.boost.org/,可从这里下载它的源代码包,这里要求下载.tar.gz包,而非.7z、.zip或bz2包)。
在当前目录下,解压boost库,如:
tar xzf boost_1_52_0.tar.gz
完成后,会在当前目录下新生成一个boost子目录boost_1_52_0,进入boost_1_52_0子目录,可以看到一个bootstrap.sh,执行它:
./bootstrap.sh
执行成功后,会在当前目录下生成一个可执行程序b2,使用它来完成对boost的编译,b2的命令行参数为:
./b2 install --prefix=PREFIX
完整脚本,不需要的组件使用--without去掉,如不需要python:--without-python
#
# install boost
#
printf "\n\033[1;33minstalling boost\033[m\n"
tar xzf $boost.tar.gz
cd $boost
#./bootstrap.sh --show-libraries
./bootstrap.sh --without-icu --without-libraries=python,graph,graph_parallel,mpi,wave
if test $? -ne 0; then
exit 1
fi
./b2 install threading=multi --prefix=$THIRD_PARTY_HOME/boost --without-python --without-graph --without-graph_parallel --without-mpi --without-wave
printf "\n\033[1;33m./b2 install return $?\033[m\n"
cd -