¿Cómo vincular con la versión PIC de la dependencia de una biblioteca en CMake?
CMake:
Tenemos una dependencia decpp-netlib.
Lo construimos desde la fuente como parte de nuestro sistema de construcción.
cpp-netlib/CMakeLists.txt
:
add_library(cpp-netlib
STATIC
${SRCS})
Para un caso de uso en particular, tenemos que usarlo en una biblioteca compartida, así que he creado una segunda biblioteca con-fPIC
habilitado:
add_library(cpp-netlib_pic
STATIC
${SRCS})
set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE)
En mi objetivo de biblioteca compartida, luego enlacelibcpp-netlib_pic.a
foo/CMakeLists.txt
:
add_library(foo
SHARED
${SRCS})
target_link_libraries(foo cpp-netlib_pic)
Recibo un error de vinculador porquecpp-netlib
está intentando vincular contra la versión no pic deboost_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
Nombre desmanchado:
$ c++filt _ZTVN5boost7network4http4impl15normal_delegateE
vtable for boost::network::http::impl::normal_delegate
Mejora de construcción:
Todo esto es parte de la migración de nuestro sistema de compilación existente de boost-build a CMake.
Los Jamfiles boost-build funcionan bien.
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
;
Esto funciona.
Tenga en cuenta que no hay mención deboost::network
en cualquier lugar, aunque hay una subcarpeta encpp-netlib/boost/library
, pero solo contiene encabezados.
Pregunta:
¿Cómo le digo a CMake quecpp-netlib_pic
necesita usar la versión pic deboost_network
?