Який ідіоматичний спосіб у CMAKE додати параметр компілятора -fPIC?


119

Я натрапив щонайменше на 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")працювало для мене.
Барракуда

Відповіді:


179

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

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 system build


Другий метод, як видається, є правильним способом додати його також до сторонніх конверторії. Ідеально.
010110110101

Hrm - Цікаво, як би ви додали це до проекту, який додав 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команду (перша версія вище), то ні. Якщо ви використовуєте другу версію, це в бібліотеці, а не в каталозі.
patrickvacek
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.