如何 link 针对 CMake 中库依赖的 PIC 版本?
How to link against PIC version of a library's dependency in CMake?
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)
在我的共享库目标中,然后我 link 反对 libcpp-netlib_pic.a
foo/CMakeLists.txt
:
add_library(foo
SHARED
${SRCS})
target_link_libraries(foo cpp-netlib_pic)
我收到了一个 linker 错误,因为 cpp-netlib
正在尝试 link 针对 boost_network
[=33= 的 non-pic 版本]
/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
中有一个子文件夹,但它只包含 headers。
问题:
如何告诉CMakecpp-netlib_pic
需要使用boost_network
的pic版本?
这只是没有使用正确语法的情况
而不是指定 属性:
set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE)
你得转ON
:
set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE ON)
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)
在我的共享库目标中,然后我 link 反对 libcpp-netlib_pic.a
foo/CMakeLists.txt
:
add_library(foo
SHARED
${SRCS})
target_link_libraries(foo cpp-netlib_pic)
我收到了一个 linker 错误,因为 cpp-netlib
正在尝试 link 针对 boost_network
[=33= 的 non-pic 版本]
/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
中有一个子文件夹,但它只包含 headers。
问题:
如何告诉CMakecpp-netlib_pic
需要使用boost_network
的pic版本?
这只是没有使用正确语法的情况
而不是指定 属性:
set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE)
你得转ON
:
set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE ON)