Каким идиоматическим способом в CMAKE добавить параметр компилятора -fPIC?

120

Я нашел как минимум 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
источник
это set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")сработало для меня.
Barracuda

Ответы:

180

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

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

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

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

Ссылка: CMAKE_POSITION_INDEPENDENT_CODE система сборки cmake

Amadeus
источник
Второй метод, по-видимому, также является правильным способом добавить его в стороннюю библиотеку. Отлично.
010110110101
Хм - Интересно, как бы вы добавили это в проект, добавленный ExternalProject_Add?
010110110101
2
@ 010110110101 Я не знаю, работает ли это, но вы можете попробовать указать в ExternalProject_Add с опциейCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus
12
Для целей CMAKE_POSITION_INDEPENDENT_CODEсвойство устанавливается по умолчанию SHARED, явно указывать его не нужно.
Роберт
1
@Carbon, если вы используете setкоманду (первая версия выше), то нет. Если вы используете вторую версию, то это для каждой библиотеки, а не для каталога.
Патриквачек