Я нашел как минимум 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
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
сработало для меня.Ответы:
Вы можете установить независимое от позиции свойство кода для всех целей:
или в конкретной библиотеке:
Ссылка: CMAKE_POSITION_INDEPENDENT_CODE система сборки cmake
источник
CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
CMAKE_POSITION_INDEPENDENT_CODE
свойство устанавливается по умолчаниюSHARED
, явно указывать его не нужно.set
команду (первая версия выше), то нет. Если вы используете вторую версию, то это для каждой библиотеки, а не для каталога.