LINUX.ORG.RU

собрать googletest как shared library

 , ,


0

2

Моя проблема озвучена в этом треде: http://stackoverflow.com/questions/26293287/how-to-set-build-shared-libs-for-...

Дело в том, что все мои библиотеки уже собираются как shared. Так вот если я после полученной ошибки:

/usr/bin/ld: ../../common-cpp/googletest/googlemock/gtest/libgtest.a(gtest-all.cc.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
../../common-cpp/googletest/googlemock/gtest/libgtest.a: error adding symbols: Bad value
collect2: error: ld returned 1 exit status

запущу make ещё раз, то он соберёт нужную shared версию. Как сделать так, чтобы с первого раза собирал?

★★★★★

Так gtest собирается с -fPIC? Или он как-то при втором make с ним пересобирается. В любом случае должен с ним собираться изначально. Может что-то не так с правилами cmake и объектные файлы дважды собираются по-разному.

xaizek ★★★★★
()

Как уже верно заметили нижевыше нужен флаг -fPIC.

Однако, сборка gtest как динамической либы само по себе затея странная и врят ли заработающая например под оффтопик. Если только ты не собираешься иметь много тестовых бинарей. Вообще, один из рекомендуемых способов подключения gtest в проект это:

#include <gtest-all.cc>

Обуславливается это тем на что ты уже нарвался - флаги сборки либы могут отличаться от флагов сборки всего остального проекта, что, может приводить к различным «эффектам» в рантайме, я например наблюдал такое на arm3 с каким то древним gcc тулчейном при статической сборке.

pon4ik ★★★★★
()
Последнее исправление: pon4ik (всего исправлений: 1)
Ответ на: комментарий от pon4ik

Мне не нужен fpic, мне нужно, чтобы cmake начал shared сборку. А он при первом вызове делает static, а только при втором shared.

Если только ты не собираешься иметь много тестовых бинарей.

Бинарь один. Тестируемых .so файлов несколько.

UVV ★★★★★
() автор топика
Ответ на: комментарий от xaizek

Именно. Первый раз он почему-то собирает ненужную мне статику, а вторую раз нужную мне динамику.

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

Нет, в первом случае он сообщает, что не может сделать shared, так как нет fPIC. Найди в CMakeLists проекта строчку с set_target_properties и допиши туда после слова PROPERTIES POSITION_INDEPENDENT_CODE 1. Подробнее в доку CMake к функции set_target_properties.

a1batross ★★★★★
()
Ответ на: комментарий от a1batross

Сделав grep -nr "libgtest.a" | more, я нашёл, что она попала в зависимость не к библиотеке, а к бинарнику:

set(gtestrunner_SOURCES
    main.cpp
)

add_executable(gtestrunner
    ${gtestrunner_SOURCES}
)

target_compile_definitions(gtestrunner
    PRIVATE
    -DGTEST_LINKED_AS_SHARED_LIBRARY=1
)

target_link_libraries(gtestrunner
    gtest
    ${Boost_LIBRARIES}
    ${CMAKE_DL_LIBS}
)

Как указать, что gtest должна быть shared?

UVV ★★★★★
() автор топика
Ответ на: комментарий от a1batross

Нашёл косяк! Если вызвать cmake как: cmake -DBUILD_SHARED_LIBS=1 ../project, то всё работает. Теперь вопрос. У меня в двух CMakeLists.txt написано set(BUILD_SHARED_LIBS ON). Почему оно не работает?

UVV ★★★★★
() автор топика
Ответ на: комментарий от pon4ik

Докопал до этой строчки в googletest/CMakeLists.txt:

option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
Она сбрасывает значение в OFF. В итоге только через командную строку получается...

UVV ★★★★★
() автор топика
Ответ на: комментарий от UVV

не может того быть, я нормально ее собирал таким образом...

shty ★★★★★
()
Ответ на: комментарий от UVV

Ты без проблем можешь добавить любые опции в кэш.

Ты же подключаешь как sub_directory? Остальное в случае cmake не комильфо имхо.

pon4ik ★★★★★
()
Ответ на: комментарий от pon4ik

Точно. Как раз нагуглил решение http://stackoverflow.com/questions/3766740/overriding-a-default-option-value-...

set(BUILD_SHARED_LIBS ON CACHE BOOL "Build gtest as a shared library" FORCE)

Имхо, мне этот способ использования gtest больше нравится, что бы вы тут все не говорили =)

P.S.: всем спасибо!

UVV ★★★★★
() автор топика
Последнее исправление: UVV (всего исправлений: 1)
Ответ на: комментарий от UVV

Пока ты собираешь их в рамках своего проекта - всё ок с любой конфигурацией. Проблемы начинаются когда ты собираешь их отдельно.

Я изначально подумал, что речь как раз про вариант 2.

pon4ik ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.