wie zu zwingen, Zusammenstellung von Boost zu verwenden -fPIC
Die Teams auf dem ich arbeite, erzeugt eine shared-library für die Verwendung in Python. Diese Bibliothek ist komplett in C++ und wir benutzen Boost zu setzen, um python. Da wir nicht garantieren können, dass unsere Kunden die Boost-Bibliotheken installiert, wir ziehen in die Funktionalität benötigt, die von Boost, um die shared-object-Datei statisch. Die Letzte Stufe in der Zusammenstellung bereits vertraut viele
g++ -o <output> <objects> -Wl,-Bstatic -lboost_python -lboost_regex ... -Wl,-Bdynamic -shared <other_opts>
Haben wir traditionell unsere eigenen bauen von Boost: 1.47. Diese version ist jetzt schon ziemlich alt und daher möchten wir aktualisieren. Aber, seltsam, wenn ich installieren Sie die erforderlichen Objekte mit yum auf meinem CentOS-7-system, bekomme ich die folgende Fehlermeldung vom gcc:
relocation R_X86_64_32 against '.rodata.str1.1' can not be used when making a shared object; recompile with -fPIC
Gut, ich dachte, ich würde einfach laden Sie die neuesten boost (CentOS 7 installiert Boost 1.53) und mein eigenes zu bauen. Dies, nachdem alle, ist immer für uns gearbeitet. Ich Folge der Anleitung hier aber ich habe den gleichen Fehler. Wie kann ich erzwingen Sie die Verwendung von -fPIC, selbst für den statischen Bibliotheken, die es baut?
- Sind Sie sicher, dass gcc (oder die ausführbare Datei zur Laufzeit) ist das finden der custom-built-Boost Bibliotheken? Sie können ändern Sie die Bibliothek durchsuchen von Verzeichnissen mit
-L
im gcc oderLD_LIBRARY_PATH
zur Laufzeit. - Sie können direkten boost-build zu verwenden compiler-flags verwenden
cxxflags="-fPIC"
. Es ist eine ähnliche variable mit dem Namenlinkflags
. Siehe boost-build-Dokumentation unter boost.org/build/doc/html/bbv2/overview/invocation.html - ja, ich bin sicher, dass meine Bibliotheken, die verwendet wurden, die von ld. Ich bin mit der option-L um ld zu erzwingen. Vielen Dank für diesen link. Der link, den ich verwendet wurde leider nicht erwähnt.
- "Denn wir können nicht garantieren, dass unsere Kunden die Boost-Bibliotheken installiert" dies ist Sicherlich, warum wir veröffentlichen Abhängigkeiten? Nennen Sie in Ihrem U / MIN ist .spec-Datei?
- Das ist genau das, was ich schließlich beschlossen, zu tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube boost automatisch verwendet
-fPIC
beim kompilieren eine shared library (.also die Datei), aber die unten Befehl verwendet-fPIC
beim kompilieren eine statische Bibliothek (.eine Datei) zu.Dieser arbeitete für mich auf boost 1.46.1:
Den
...
ist, wo Sie hinzufügen, zusätzliche flags wiethreading=multi
oder--layout=tagged
und Optional der Liste der Projekte zu bauen (zum Beispiel:--with-regex
).Hinweis: ich bin mir nicht sicher
cflags
ist notwendig, aber es scheint nicht zu Schaden.Referenz-links:
cflags
scheint überflüssig. Auchsudo
sollten redundant sein für die lokale (d.h. nicht-system-wide) - installation .cflags
wahrscheinlich überflüssig ist. Ich war nicht sicher, ob ich es brauchte, aber Sie schien nicht verletzt zu sein.Nur für die Bequemlichkeit, kombinierte ich die vorherigen Antworten und Kommentare zu:
--mit-system ist nicht notwendig, aber es ist ein Ort, wo können Sie weitere boost-Optionen kompilieren
Klappt es bei mir auf CentOS 7 mit boost 1.67