在CentOS 7 x64系统上,我使用-fPIC构建了最新的Boost 1.61.0。我试图将libboost_log.a链接到我构建的动态库,以便我的库的用户不必安装Boost。使用CentOS 7附带的GCC 4.8.5库存成功,但是当我从devtoolset-4使用GCC 5.2.1时失败了。
这是错误:
/opt/rh/devtoolset-4/root/usr/libexec/gcc/x86_64-redhat-linux/5.2.1/ld: /opt/boost/lib/libboost_log.a(attribute_name.o): relocation R_X86_64_32 against `_ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43' can not be used when making a shared object; recompile with -fPIC
/opt/boost/lib/libboost_log.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status
我是如何构建Boost的:
./b2 -j6 -q -d+2 cxxflags=-fPIC cflags=-fPIC variant=release
Boost默认使用-O3
。因此我的程序也使用-O3
。
构建我的库的命令:
/opt/rh/devtoolset-4/root/usr/bin/c++ -fPIC -O3 -g -DNDEBUG -shared -Wl,-soname,libfoobar.so.0 -o libfoobar.so.0.5 foobar.cc.o -L/opt/boost/lib /opt/boost/lib/libboost_filesystem.a /opt/boost/lib/libboost_log.a /opt/boost/lib/libboost_program_options.a -lpthread -Wl,-rpath,/opt/boost/lib
证明libboost_log.a是使用fPIC构建的:
$ objdump -r /opt/boost/lib/libboost_log.a | grep _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 0000000000000002 R_X86_64_32 _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 0000000000000011 R_X86_64_32S _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 00000000000001a3 R_X86_64_32 _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 00000000000001be R_X86_64_32S _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 000000000000001c R_X86_64_32S _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43 0000000000000021 R_X86_64_32 _ZZN5boost3log12v2s_mt_posix3aux14lazy_singletonINS1_14attribute_name10repositoryENS_10shared_ptrIS5_EEE3getEvE29_boost_log_once_block_flag_43
思想:
正如您所看到的libboost_filesystem.a
似乎链接正常,只有libboost_log.a
无法链接。我现在可以查看哪些内容?任何提示都是受欢迎的。谢谢!
答案 0 :(得分:1)
使用 / opt / rh / devtoolset-4 / root / usr / bin / c ++ 的编译器不是 / usr / bin / c ++ 。如果这两个编译器具有不同版本的C ++头文件,则它们可能会生成具有不同方法符号的库(名称修改)。如果编译器版本不同,可能还有其他原因导致链接失败。
我建议编译C ++代码,以便在编译每个C ++库时至少主要版本的gcc是相同的。