Jaki jest idiomatyczny sposób dodawania opcji kompilatora -fPIC w CMAKE?

120

Znalazłem co najmniej 3 sposoby, aby to zrobić i zastanawiam się, który jest idiomatyczny. Należy to zrobić prawie zawsze dla każdej biblioteki statycznej. Dziwię się, że generator Makefile w CMake nie dodaje tego automatycznie do bibliotek statycznych. (chyba że czegoś mi brakuje?)

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")

Uważam, że mogą istnieć również inne odmiany. (edytuj moje pytanie, jeśli je znajdziesz)

Jeśli znasz odpowiedź na to pytanie, czy wiesz również, czy istnieje sposób na spowodowanie kompilacji projektu CMake innej firmy z tą flagą bez modyfikowania jego pliku CMakeLists.txt? Natknąłem się na biblioteki statyczne, w których brakuje tej flagi. Powoduje problemy podczas kompilowania biblioteki statycznej do biblioteki dynamicznej.

Dostajesz:

relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
010110110101
źródło
to set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")działało dla mnie.
Barracuda

Odpowiedzi:

180

Możesz ustawić niezależną od pozycji właściwość kodu dla wszystkich celów:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

lub w określonej bibliotece:

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

Odniesienie: CMAKE_POSITION_INDEPENDENT_CODE system kompilacji cmake

Amadeus
źródło
Druga metoda wydaje się być właściwym sposobem dodania go również do biblioteki innej firmy. Idealny.
010110110101
Hrm - zastanawiam się, jak dodałbyś to do projektu dodanego przez ExternalProject_Add?
010110110101
2
@ 010110110101 Nie wiem, czy to działa, ale możesz spróbować określić to w ExternalProject_Add z opcjąCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus,
12
CMAKE_POSITION_INDEPENDENT_CODEWłaściwość jest ustawiona domyślnie dla SHAREDcelów, nie ma potrzeby, aby ustawić go w sposób jawny.
robert
1
@Carbon, jeśli używasz setpolecenia (pierwsza wersja powyżej), to nie. Jeśli używasz drugiej wersji, jest ona przypisana do biblioteki, a nie do katalogu.
patrickvacek