comment faire pour forcer la compilation de Boost à utiliser-fPIC
L'équipe sur laquelle je travail produit une bibliothèque partagée pour une utilisation en Python. Cette bibliothèque est entièrement en C++ et nous utiliser Boost exposer à python. Parce que nous ne pouvons pas garantir que nos clients ont les bibliothèques Boost installé, nous tirons la fonctionnalité nécessaire de Stimuler le fichier objet partagé de manière statique. La dernière étape de compilation doit vous paraître familier à de nombreux
g++ -o <output> <objects> -Wl,-Bstatic -lboost_python -lboost_regex ... -Wl,-Bdynamic -shared <other_opts>
Nous avons traditionnellement utilisé notre propre compilation de Boost: 1.47. Cette version est maintenant assez vieux et donc, nous souhaitons mettre à jour. Cependant, curieusement, lorsque j'installe les objets nécessaires à l'aide de yum sur mon CentOS 7, j'obtiens l'erreur suivante à partir de gcc:
relocation R_X86_64_32 against '.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
Bien, je pensais que je serais tout simplement de télécharger la dernière boost (CentOS 7 installe Boost 1,53) et faire ma propre construction. Ceci, après tout, a toujours travaillé pour nous. J'ai suivi les les instructions ici, mais j'ai eu la même erreur. Comment puis-je forcer l'utilisation d'-fPIC, même pour les bibliothèques statiques qu'il construit?
- Êtes-vous sûr que gcc (ou l'exécutable au moment de l'exécution) est de trouver le custom-built bibliothèques Boost? Vous pouvez modifier la bibliothèque de recherche de répertoires à l'aide de
-L
dans gcc ouLD_LIBRARY_PATH
au moment de l'exécution. - Vous pouvez renforcer directement la construction afin d'utiliser les drapeaux de compilation à l'aide de
cxxflags="-fPIC"
. Il est similaire variable nomméelinkflags
. Voir stimuler la génération de la documentation à l'adresse boost.org/build/doc/html/bbv2/overview/invocation.html - oui, je suis sûr que mes bibliothèques ont été utilisés par ld. Je suis à l'aide de l'option-L ld pour respecter cela. Merci beaucoup pour ce lien. Le lien que j'ai été en utilisant n'ai pas le mentionner.
- "Parce que nous ne pouvons pas garantir que nos clients ont les bibliothèques Boost installé" Sûrement, c'est pourquoi nous publions des dépendances? Nom dans votre TR / min .le fichier de spécification?
- C'est précisément ce que j'ai finalement décidé de le faire.
Vous devez vous connecter pour publier un commentaire.
Je crois boost utilise automatiquement
-fPIC
lors de la compilation d'une bibliothèque partagée (.si le fichier), mais la commande ci-dessous utilise-fPIC
lors de la compilation d'une bibliothèque statique (.un fichier) trop.Cela a fonctionné pour moi sur un coup de pouce 1.46.1:
La
...
vous permet d'ajouter des options supplémentaires commethreading=multi
ou--layout=tagged
, et éventuellement la liste des projets à construire (par exemple:--with-regex
).Note: je ne suis pas certain
cflags
est nécessaire, mais il ne semble pas blessé.Liens de référence:
cflags
semble redondant. Aussisudo
devrait être redondante pour les locaux (c'est à dire pas à l'échelle du système) de l'installation .cflags
est probablement superflu. Je n'étais pas sûr si j'ai besoin d'elle, mais il ne semblait pas blessé.Juste pour des raisons de commodité, j'ai combiné à la réponse précédente et commentaires:
--with-system n'est pas nécessaire, mais c'est un endroit où vous pouvez ajouter d'autres boost options de compilation
Il fonctionne pour moi sur CentOS 7 avec boost de 1,67