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
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
działało dla mnie.Odpowiedzi:
Możesz ustawić niezależną od pozycji właściwość kodu dla wszystkich celów:
lub w określonej bibliotece:
Odniesienie: CMAKE_POSITION_INDEPENDENT_CODE system kompilacji cmake
źródło
CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
CMAKE_POSITION_INDEPENDENT_CODE
Właściwość jest ustawiona domyślnie dlaSHARED
celów, nie ma potrzeby, aby ustawić go w sposób jawny.set
polecenia (pierwsza wersja powyżej), to nie. Jeśli używasz drugiej wersji, jest ona przypisana do biblioteki, a nie do katalogu.