2013-02-20 8 views
17

Ich möchte mein aktuelles Projekt nach C++ 11 verschieben. Der Code kompiliert alles mit clang ++ -std = C++ 0x. Das ist der einfache Teil :-). Der schwierige Teil beschäftigt sich mit externen Bibliotheken. Man kann sich nicht darauf verlassen, dass man seine C++ 11-Objekte mit externen Bibliotheken verknüpft, die nicht mit C++ 11 kompiliert wurden (siehe http://gcc.gnu.org/wiki/Cxx11AbiCompatibility). Boost zum Beispiel muss sicherlich neu aufgebaut werden (Why can't clang with libc++ in c++0x mode link this boost::program_options example?). Ich habe eine Quelle für alle externen Bibliotheken, die ich benutze, so kann ich (mit etwas Mühe) diese Bibliotheken theoretisch mit C++ 11 neu aufbauen. Das bringt jedoch noch einige Probleme mit sich:Verwalten von externen Bibliotheken (z. B. Boost) während des Übergangs zu C++ 11

Entwicklung in einer gemischten C++ 03/C++ 11-Umgebung: Ich habe einige alte Projekte mit C++ 03, die gelegentliche Wartung erfordern. Natürlich möchte ich diese mit bestehenden Versionen externer Bibliotheken verknüpfen. Aber für meine aktuellen (und neuen) Projekte möchte ich mich mit meinen neu gebauten C++ 11-Versionen der Bibliotheken verbinden. Wie organisiere ich meine Entwicklungsumgebungen (derzeit Ubuntu 12.04 und Mac OS X 10.7), um damit umzugehen?

Ich gehe davon aus, dass dieses Problem von vielen Entwicklern konfrontiert werden wird. Es wird nicht weggehen, aber ich habe keine empfohlene und allgemein anerkannte Lösung gefunden.

Bereitstellung: Derzeit bin ich auf Ubuntu 12.04 LTS-Server in der Cloud bereitstellen. Erfahrung führt dazu, dass man (wenn möglich) von den Standard-Paketen (z. B. libboost) abhängt, die mit der Linux-Distribution verfügbar sind. Wenn ich mein aktuelles Projekt nach C++ 11 verschiebe, muss ich, glaube ich, meine eigenen Versionen der externen Bibliotheken erstellen. Meine Vermutung ist, dass sich das irgendwann ändern wird, und sie werden "Standard" -Versionen von Bibliothekspaketen mit C++ 11-Kompatibilität sein. Hat jemand eine Idee, wann das zu erwarten ist? Und vermutlich wird dies auch eine Standardlösung für das oben erwähnte Problem erfordern - gleichzeitige Existenz von C++ 03-Bibliotheken und C++ 11-Bibliotheken auf derselben Plattform.

Ich hoffe, dass ich etwas Grundlegendes verpasst habe, so dass diese wahrgenommenen Probleme in einem Hauch von entsprechender Information verschwinden! Versuche ich, zu früh zu C++ 11 zu wechseln?

Update (2013.09.11): Verwandte Diskussion für Macports: https://lists.macosforge.org/pipermail/macports-users/2013-September/033383.html

+3

"Wie organisiere ich meine Entwicklungsumgebungen ... um damit fertig zu werden?" - Passen Sie Ihren Build-Mechanismus an, um verschiedene Bibliothekspfade zu durchlaufen. Für Clang und GCC ist "-L" dein Freund. – Xeo

+0

@Zeo, ich kenne -L. Ich verstehe nicht, warum Clang einen anderen Bibliothekspfad zu GCC hat, um das Problem zu lösen. Vielleicht könnten Sie es ausarbeiten? Wenn ich meinen eigenen Prozess zum Marshalling verschiedener Builds von externen Standardbibliotheken in verschiedene Verzeichnisse erstellen muss (wahrscheinlich eines für C++ 11, eines für C++ 03 und eines für Bibliotheken, die mit beiden funktionieren), dann I Ich bin an einem Ort, den ich lieber meiden würde, und einen, den ich mit zig Millionen Entwicklern teilen würde, die das gleiche Rad (kleinere Variationen) erfinden. Wird es so sein? –

+0

Also ...Sie kompilieren mit clang aber verwenden Sie die gcc ABI Dokumentation? :) –

Antwort

1

Sie sollten Ihre configure Toolchain (z Autotools) auf "richtig" konfigurieren Sie Ihre Build für Ihre Ziel Bereitstellung verwenden. Ihre Konfigurationstests sollten auf ABI-kompatible C++ 11-Binärdateien prüfen und den Linker anweisen, sie bei Erkennung zuerst zu verwenden. Wenn nicht, optional Fehler oder Fallback zu einem C++ 03 Build.

Wie für C++ 11 3rd-Part-Bibliotheken in einem separaten parallelen Verzeichnisbaum installiert, ist dies nicht unbedingt erforderlich. Bibliotheks-Versionierung gibt es schon lange und ermöglicht es Ihnen, verschiedene Versionen nebeneinander auf dem System oder wo immer Sie möchten, wieder auf der Basis von configure zu platzieren.

Dies mag chaotisch erscheinen, aber konfigurieren Toolchains wurden entwickelt, um mit diesen Durcheinander umzugehen.

+0

diese klingen wie die richtigen Werkzeuge für den Job. Wie kann man "nach ABI kompatiblen C++ 11 Binärdateien suchen?". Mit verschiedenen Versionen (C++ 03, C++ 11) Versionen von externen Bibliotheken in demselben Verzeichnis, kann man beide gleichermaßen auf ABI-Kompatibilität prüfen? Oder müssen Sie zum Beispiel symbolische Links einrichten, die der Option -l Linker entsprechen? –

+0

Ja, es scheint unordentlich! Zu chaotisch für mich, um es zu versuchen (ich habe immer autoconf furchterregend gefunden!), Es sei denn, ich kann kopieren, was ein anderer, der mit den Werkzeugen vertrauter ist, getan hat. –

Verwandte Themen