连接Boost静态库

3

我正在尝试编译一个使用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?我在网上查阅了一些信息,但并没有找到太多关于这方面的内容,这使我开始怀疑自己是否在寻找正确的东西。你有任何建议吗? 编辑:根据Mike的建议,我用以下方式重新编译了Boost:
./b2 cxxflags="-fPIC" link=static install

我现在可以编译我的.so库文件了。

2个回答

3
这是否意味着我必须使用-fPIC命令重新编译Boost?
是的。所有链接到共享库中的代码都必须是位置无关代码(Position Independent Code)。静态库中的目标文件通常不是这样,因为共享库通常会链接其他共享库。
但原则上没有任何阻止您从使用-fPIC编译的目标文件构建boost静态库。
当然,更简单的方法是链接共享版本的boost库。

1

使用boost 1.72.0,通过重新编译带有-fPIC的boost静态库来解决这个问题。

./bootstrap.sh --prefix=/usr/
sudo ./b2 cxxflags=-fPIC cflags=-fPIC link=static -a
sudo ./b2 install

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接