Как связать 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, но содержит только заголовки.


Вопрос:

Как мне сказать, что CMake cpp-netlib_pic необходимо использовать версию ПОС boost_network?

2

Решение

Это всего лишь случай не использования правильного синтаксиса

Вместо указания свойства:

set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE)

Вы должны включить его ON:

set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE ON)
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]