Как связать PIC-версию зависимости библиотеки в 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)
Затем в моей целевой библиотеке я делаю ссылку наlibcpp-netlib_pic.a
foo/CMakeLists.txt
:
add_library(foo
SHARED
${SRCS})
target_link_libraries(foo cpp-netlib_pic)
Я получаю ошибку компоновщика обратно, потому чтоcpp-netlib
пытается связать против не-пик версии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:
Это все часть перехода нашей существующей системы сборки с boost-build на CMake.
Буст-билд 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
, но содержит только заголовки.
Вопрос:
Как мне сказать, что CMakecpp-netlib_pic
необходимо использовать версию ПОСboost_network
?