Спуск с CMake в библиотеке

Я пишу библиотеку, которая использует CMake, и пытаюсь связать с ней Abseil, следуя приведенным здесь инструкциям:

https://github.com/abseil/abseil-cpp/blob/master/CMake/README.md

Мой CMakeLists.txt в основном содержит:

add_library(MyLib SHARED src/mylib.cc)
add_subdirectory(third_party/abseil-cpp)
target_link_libraries(MyLib PRIVATE absl::base absl::strings absl::str_format)

Теперь, если я скомпилирую свою библиотеку, я получаю следующую ошибку:

/usr/bin/ld: third_party/abseil-cpp/absl/strings/libabsl_absl_str_format_internal.a(arg.cc.o): relocation R_X86_64_PC32 against symbol `_ZNKSt17basic_string_viewIcSt11char_traitsIcEE4sizeEv' can not be used when making a shared object; recompile with -fPIC

Другими словами, CMake компилирует Abseil без использования независимого от позиции кода. Затем я попытался для развлечения посмотреть, что произойдет, если вместо этого я изменю свою библиотеку на статическую. Замена CMakeLists.txt на

add_library(MyLib STATIC src/mylib.cc)
add_subdirectory(third_party/abseil-cpp)
target_link_libraries(MyLib PRIVATE absl::base absl::strings absl::str_format)

Я получаю следующую ошибку при запуске cmake:

CMake Error: install(EXPORT "MyLibTargets" ...) includes target "MyLib" which requires target "absl_base" that is not in the export set.
CMake Error: install(EXPORT "MyLibTargets" ...) includes target "MyLib" which requires target "absl_strings" that is not in the export set.
CMake Error: install(EXPORT "MyLibTargets" ...) includes target "MyLib" which requires target "absl_str_format" that is not in the export set.

Я новичок в CMake, и мне не удалось понять, как исправить любую ошибку. Как вы можете транзитивно в CMake указать, что зависимости должны компилироваться для позиционирования независимого кода?


person eof    schedule 21.11.2019    source источник


Ответы (1)


Из этой темы на GitHub:

Похоже, вы хотите использовать CMAKE_POSITION_INDEPENDENT_CODE, как было предложено @Mizux ранее. Добавьте set(CMAKE_POSITION_INDEPENDENT_CODE TRUE) в файл CMakeLists.txt [...]

Это должно исправить любые проблемы, которые вы видите при создании общей библиотеки, в то же время статически собирая и связывая спуск с вашей библиотекой.

person Botje    schedule 21.11.2019