Quelle est la manière idiomatique dans CMAKE d'ajouter l'option de compilateur -fPIC?

119

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
010110110101
la source
cela a set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")fonctionné pour moi.
Barracuda

Réponses:

179

Vous pouvez définir la propriété de code indépendante de la position sur toutes les cibles:

set(CMAKE_POSITION_INDEPENDENT_CODE ON)

ou dans une bibliothèque spécifique:

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

Référence: CMAKE_POSITION_INDEPENDENT_CODE cmake build system

Amadeus
la source
La deuxième méthode semble être la bonne façon de l'ajouter également à une bibliothèque tierce. Parfait.
010110110101
Hrm - Je me demande comment ajouterais-tu cela à un projet ajouté par ExternalProject_Add?
010110110101
2
@ 010110110101 Je ne sais pas si cela fonctionne, mais vous pouvez essayer de spécifier, à ExternalProject_Add avec optionCMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"
Amadeus
12
La CMAKE_POSITION_INDEPENDENT_CODEpropriété est définie par défaut pour les SHAREDcibles, il n'est pas nécessaire de la définir explicitement.
robert
1
@Carbon si vous utilisez la setcommande (la première version ci-dessus), alors non. Si vous utilisez la deuxième version, c'est par bibliothèque, pas par répertoire.
patrickvacek