176 votes

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

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.

258voto

Tomás Badan Points 2051

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 lib1.cpp)
set_property(TARGET lib1 PROPERTY POSITION_INDEPENDENT_CODE ON)

Référence : CMAKE_POSITION_INDEPENDENT_CODE système de construction CMake

1 votes

La deuxième méthode semble être la bonne façon de l'ajouter à une bibliothèque tierce aussi. Parfait.

0 votes

Hrm -- Je me demande comment vous ajouteriez ceci à un projet ajouté par ExternalProject_Add?

3 votes

@010110110101 Je ne sais pas si cela fonctionne, mais vous pouvez essayer de le spécifier, à ExternalProject_Add avec l'option CMAKE_CACHE_ARGS "-DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=true"

35voto

scai Points 5123

Vous pouvez également passer l'option de ligne de commande suivante à cmake (dans le cas où ce n'est pas votre projet cmake et/ou que vous ne pouvez pas ou ne voulez pas modifier les fichiers du projet) :

-DCMAKE_POSITION_INDEPENDENT_CODE=ON

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X