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
?