Wie kann in CMake eine Verknüpfung zur PIC-Version der Abhängigkeit einer Bibliothek hergestellt werden?

CMake:

Wir haben eine Abhängigkeit von cpp-netlib.

Wir erstellen es aus dem Quellcode als Teil unseres Build-Systems.

cpp-netlib/CMakeLists.txt:

add_library(cpp-netlib
    STATIC
    ${SRCS})

Für einen bestimmten Anwendungsfall müssen wir ihn in einer gemeinsam genutzten Bibliothek verwenden, daher habe ich eine zweite Bibliothek mit @ erstell-fPIC aktiviert

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

In meinem Ziel für die gemeinsam genutzte Bibliothek verbinde ich dann mitlibcpp-netlib_pic.a

foo/CMakeLists.txt:

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

Ich erhalte einen Linker-Fehler zurück, weilcpp-netlib versucht, eine Verknüpfung mit der Nicht-Bild-Version von @ herzustelleboost_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

Entwirrter Name:

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

Boost Build:

Dies ist alles Teil der Migration unseres bestehenden Build-Systems von Boost-Build zu CMake.

Die Boost-Build-Jamfiles funktionieren einwandfrei.

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
;

Das funktioniert

Hinweis es gibt keine Erwähnung vonboost::network überall, obwohl es einen Unterordner in @ gicpp-netlib/boost/library, aber es enthält nur Überschriften.

Frage

Wie sage ich CMake, dasscpp-netlib_pic muss die pic-Version von @ verwendboost_network?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage