【问题标题】:Linking Boost static libraries链接 Boost 静态库
【发布时间】:2018-03-06 10:55:12
【问题描述】:

我正在尝试使用来自 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 库了。

【问题讨论】:

    标签: opencv boost shared-libraries static-libraries


    【解决方案1】:

    这是否意味着我必须使用 -fPIC 命令重新编译 Boost?

    是的。链接到共享库的所有代码都必须是位置无关代码。目的 静态库中的文件通常不是共享库 链接其他共享库。

    但原则上没有什么可以阻止您构建 boost 静态库 来自-fPIC-编译的目标文件。

    当然,链接 boost 库的共享版本会更简单。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-04
        • 1970-01-01
        • 2011-01-21
        • 1970-01-01
        相关资源
        最近更新 更多