【问题标题】:How to link against PIC version of a library's dependency in CMake?如何在 CMake 中链接库依赖项的 PIC 版本?
【发布时间】:2016-08-28 18:05:54
【问题描述】:

CMake:

我们依赖于cpp-netlib

作为构建系统的一部分,我们从源代码构建它。

cpp-netlib/CMakeLists.txt:

add_library(cpp-netlib
    STATIC
    ${SRCS})

对于一个特定的用例,我们必须在共享库中使用它,因此我创建了第二个启用 -fPIC 的库:

add_library(cpp-netlib_pic
    STATIC
    ${SRCS})
set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE)

在我的共享库目标中,然后我链接到 libcpp-netlib_pic.a

foo/CMakeLists.txt:

add_library(foo
    SHARED
    ${SRCS})
target_link_libraries(foo cpp-netlib_pic)

我收到了一个链接器错误,因为cpp-netlib 正试图链接到boost_network 的非图片版本

/usr/bin/ld: ../third_party/cpp-netlib/libcpp-netlib_pic.a(client.cpp.o): \
    relocation R_X86_64_32 against `_ZTVN5boost7network4http4impl15normal_delegateE' \
    can not be used when making a shared object; recompile with -fPIC

拆解的名称:

$ c++filt _ZTVN5boost7network4http4impl15normal_delegateE
vtable for boost::network::http::impl::normal_delegate

增强构建:

这是将我们现有的构建系统从 boost-build 迁移到 CMake 的全部过程。

boost-build Jamfile 工作正常。

Jamroot:

variant pic : release : <cxxflags>-fPIC ;

cpp-netlib/Jamfile:

lib cpp-netlib 
: [ glob src/*.cpp ]
;

foo/Jamfile:

shared-lib foo
: [ glob *.cpp ]
  /ext/cpp-netlib//cpp-netlib/<variant>pic
: <link>shared
  <cxxflags>-fPIC
;

这行得通。

请注意,尽管cpp-netlib/boost/library 中有一个子文件夹,但在任何地方都没有提到boost::network,但它只包含标题。


问题:

如何告诉 CMake cpp-netlib_pic 需要使用图片版本的boost_network

【问题讨论】:

  • 您是否尝试过使用 PIC 标志 (bjam cxxflags=-fPIC) 构建提升?
  • 你有boost_network的图片和非图片版本吗?
  • @RustyX boost 库已经存在并且正在运行。我已经更新了问题以表明使用boost-build 可以很好地编译相同的源代码,因此这是配置 CMake 的问题,而不是缺少正确的构建版本。
  • @Leon 我已经更新了问题以表明使用boost-build 可以很好地编译相同的源代码,我猜这表明这是配置 CMake 的问题,而不是缺少正确的 @ 构建987654348@.
  • @RustyX 我已经证明问题在于cpp-netlib_pic 不是用-fPIC 构建的。详情请见this question

标签: c++ cmake fpic


【解决方案1】:

这只是没有使用正确语法的情况

而不是指定属性:

set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE)

你必须转它ON

set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE ON)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多