Что такое идиоматический способ в CMAKE для добавления опции -fPIC-компилятора?

30

У меня есть как минимум 3 способа сделать это, и мне интересно, каков идиоматический путь. Это нужно сделать почти повсеместно для любой статической библиотеки. Я удивлен, что генератор Makefile в CMake автоматически не добавляет это в статические библиотеки. (если я что-то не хватает?)

target_compile_options(myLib PRIVATE -fPIC)

add_compile_options(-fPIC)

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")

Я считаю, что могут быть и другие варианты. (пожалуйста, отредактируйте мой вопрос, если найдете его)

Если вам посчастливилось узнать ответ на этот вопрос, знаете ли вы, есть ли способ скомпилировать проект третьей стороны CMake с этим флагом, не изменяя его файл CMakeLists.txt? Я столкнулся с статическими библиотеками, у которых отсутствует этот флаг. Это вызывает проблемы при компиляции статической библиотеки в динамическую библиотеку.

Вы получаете:

relocation R_X86_64_32 against '.rodata' can not be used when making a shared object; recompile with -fPIC
    
задан 010110110101 10.07.2016 в 23:50
источник

1 ответ

56

Вы можете установить свойство независимого кода позиции для всех целей:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

или в определенной библиотеке:

add_library(lib1 SHARED lib1.cpp)
set_property(TARGET lib1 PROPERTY POSITION_INDEPENDENT_CODE ON)

Ссылка: CMAKE_POSITION_INDEPENDENT_CODE cmake system

    
ответ дан Amadeus 11.07.2016 в 01:45
источник
  • Второй способ - это правильный способ добавить его в стороннюю библиотеку. Отлично. –  010110110101 11.07.2016 в 05:04
  • Hrm - Интересно, как бы вы добавили это в проект, добавленный ExternalProject_Add? –  010110110101 16.07.2016 в 04:59
  • @ 010110110101 Я не знаю, работает ли он, но вы можете попробовать указать в ExternalProject_Add с параметром CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE: BOOL = true" –  Amadeus 16.07.2016 в 05:42
  • Свойство CMAKE_POSITION_INDEPENDENT_CODE устанавливается по умолчанию для целей SHARED, поэтому нет необходимости его явно устанавливать. –  robert 13.10.2016 в 16:18
  • @Carbon, если вы используете команду set (первая версия выше), затем нет. Если вы используете вторую версию, это за библиотеку, а не за каталог. –  patrickvacek 19.02.2018 в 09:39