Как связать 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 пытается связать не-pic версию 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 на 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?


person Steve Lorimer    schedule 28.08.2016    source источник
comment
Пробовали ли вы наращивать буст с флагом PIC (bjam cxxflags=-fPIC)?   -  person rustyx    schedule 28.08.2016
comment
У вас есть версии boost_network как с изображением, так и без изображения?   -  person Leon    schedule 28.08.2016
comment
@RustyX, библиотеки boost присутствуют и работают. Я обновил вопрос, чтобы показать, что тот же исходный код отлично компилируется с использованием boost-build, так что это проблема с настройкой CMake, а не с отсутствием правильных версий сборки.   -  person Steve Lorimer    schedule 29.08.2016
comment
@Leon Леон Я обновил вопрос, чтобы показать, что тот же исходный код отлично компилируется с использованием boost-build, что, я думаю, показывает, что проблема связана с настройкой CMake, а не с отсутствием правильной сборки boost_network.   -  person Steve Lorimer    schedule 29.08.2016
comment
@RustyX Я доказал, что проблема в том, что cpp-netlib_pic не строится с -fPIC. Дополнительные сведения см. в этом вопросе.   -  person Steve Lorimer    schedule 29.08.2016
comment
@ Леон Я доказал, что проблема в том, что cpp-netlib_pic не строится с -fPIC. Дополнительные сведения см. в этом вопросе.   -  person Steve Lorimer    schedule 29.08.2016


Ответы (1)


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

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

set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE)

Вы должны повернуть его ON:

set_property(TARGET cpp-netlib_pic PROPERTY POSITION_INDEPENDENT_CODE ON)
person Steve Lorimer    schedule 28.08.2016