Je suis tombé sur au moins 3 façons de le faire 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 de Makefile dans CMake n'ajoute pas automatiquement cela aux bibliothèques statiques. (à moins que je ne 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. (veuillez éditer ma question si vous en trouvez une)
Si vous connaissez la réponse à cette question, savez-vous aussi s'il existe un moyen de faire compiler un projet CMake tiers avec ce drapeau sans modifier son fichier CMakeLists.txt ? Je suis tombé sur des bibliothèques statiques qui manquent de 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 contre `.rodata' ne peut pas être utilisée lors de la création d'un objet partagé ; recompilez avec -fPIC
0 votes
Cette
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
a fonctionné pour moi.3 votes
^ Ne fais pas ça. Utilisez la propriété
POSITION_INDEPENDENT_CODE
, comme suggéré dans la réponse principale.