J'ai trouvé au moins 3 façons de faire cela et je me demande quelle est la manière idiomatique. Cela doit être fait presque universellement pour toute bibliothèque statique. Je suis surpris que le générateur Makefile dans CMake n'ajoute pas cela automatiquement aux bibliothèques statiques. (à moins que je manque quelque chose?)
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")
Je crois qu'il pourrait aussi y avoir d'autres variations. (merci de modifier ma question si vous en trouvez une)
Si vous connaissez la réponse à cette question, savez-vous également s'il existe un moyen de faire en sorte qu'un projet CMake tiers soit compilé avec cet indicateur sans modifier son fichier CMakeLists.txt? J'ai rencontré des bibliothèques statiques manquant ce drapeau. Cela pose des problèmes lors de la compilation d'une bibliothèque statique dans une bibliothèque dynamique.
Vous obtenez:
relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
Vous pouvez définir la propriété de code indépendant de la position sur toutes les cibles:
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
ou dans une bibliothèque spécifique:
add_library(lib1 SHARED lib1.cpp)
set_property(TARGET lib1 PROPERTY POSITION_INDEPENDENT_CODE ON)
Référence: CMAKE_POSITION_INDEPENDENT_CODEsystème de génération cmake