链接Boost静态库
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链接Boost静态库相关的知识,希望对你有一定的参考价值。
我正在尝试使用Boost和OpenCV中的静态库来编译共享库。下面是我用来编译库的命令。
g++ -fPIC libsaliency.cpp -shared -o libsaliency.so
-I/home/poiesi/data/libraries/boost_1_66_0/installed_w_contrib_static/include -I/home/poiesi/data/libraries/opencv-3.4.0/installed_w_contrib_static/include
-Wl,--whole-archive
/home/poiesi/data/libraries/boost_1_66_0/installed/lib/libboost_graph.a
/home/poiesi/data/libraries/boost_1_66_0/installed/lib/libboost_filesystem.a
/home/poiesi/data/libraries/boost_1_66_0/installed/lib/libboost_system.a
/home/poiesi/data/libraries/opencv-3.4.0/installed_w_contrib_static/lib/libopencv_core.a
/home/poiesi/data/libraries/opencv-3.4.0/installed_w_contrib_static/lib/libopencv_highgui.a
/home/poiesi/data/libraries/opencv-3.4.0/installed_w_contrib_static/lib/libopencv_imgproc.a
/home/poiesi/data/libraries/opencv-3.4.0/installed_w_contrib_static/lib/libopencv_imgcodecs.a
/home/poiesi/data/libraries/opencv-3.4.0/installed_w_contrib_static/lib/libopencv_features2d.a
/home/poiesi/data/libraries/opencv-3.4.0/installed_w_contrib_static/lib/libopencv_video.a
-Wl,--no-whole-archive
但是,我有这个错误:
usr/bin/ld: /home/poiesi/data/libraries/boost_1_66_0/installed/lib/libboost_graph.a(read_graphviz_new.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC
/home/poiesi/data/libraries/boost_1_66_0/installed/lib/libboost_graph.a(read_graphviz_new.o): error adding symbols: Bad value
collect2: error: ld returned 1 exit status
Makefile:7: recipe for target 'saliency' failed
make: *** [saliency] Error 1
这是否意味着我必须使用-fPIC
命令重新编译Boost?我在网上查了一下但是我没有找到很多关于它的信息。这让我想知道我是否正在寻找合适的东西。你有什么建议吗?
编辑:正如迈克下面的建议,我重新编译了Boost,如下所示:
./b2 cxxflags="-fPIC" link=static install
我现在可以编译我的.so库了。
答案
这是否意味着我必须使用-fPIC命令重新编译Boost?
是。链接到共享库的所有代码都必须是位置无关代码。静态库中的对象文件通常不是,因为共享库通常链接其他共享库。
但是原则上没有什么可以阻止你从-fPIC
编译的目标文件构建boost静态库。
当然,链接boost库的共享版本会更简单。
以上是关于链接Boost静态库的主要内容,如果未能解决你的问题,请参考以下文章