如何链接PIC库中PIC库的依赖关系?

时间:2016-08-28 18:05:55

标签: c++ cmake fpic

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正在尝试链接非pic版本的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 Jamfiles工作正常。

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
;

这很有效。

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

问题:

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

1 个答案:

答案 0 :(得分:2)

这只是不使用正确语法

的情况

而不是指定属性:

scala> intToNat(5)
res0: Succ[Succ[Succ[Succ[Succ[_0]]]]] = Succ()

scala> intToNat(-42)
<console>:19: error: Expression -42 does not evaluate to a non-negative Int literal
       intToNat(-42)
                 ^

您必须将其 set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE)

ON