J'ai rencontré au moins 3 façons de faire cela et je me demande quelle est la manière idiomatique. Cela doit être fait presque universellement dans n'importe quelle bibliothèque statique. Je suis surpris que le générateur Makefile de CMake ne l'ajoute pas automatiquement aux bibliothèques statiques. (sauf si 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 pense qu'il pourrait également y avoir d'autres variantes. (veuillez 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 compiler un projet CMake tiers avec cet indicateur sans modifier son fichier CMakeLists.txt? J'ai couru sur des bibliothèques statiques sans cet indicateur. 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
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
fonctionné pour moi.Réponses:
Vous pouvez définir la propriété de code indépendante de la position sur toutes les cibles:
ou dans une bibliothèque spécifique:
Référence: CMAKE_POSITION_INDEPENDENT_CODE cmake build system
la source
CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
CMAKE_POSITION_INDEPENDENT_CODE
propriété est définie par défaut pour lesSHARED
cibles, il n'est pas nécessaire de la définir explicitement.set
commande (la première version ci-dessus), alors non. Si vous utilisez la deuxième version, c'est par bibliothèque, pas par répertoire.