Ich frage mich, was ist die richtige / einfache Möglichkeit, eine binäre libc ++ auf Ubuntu zu installieren, in meinem Fall Trusty aka 14.04?
Auf der LLVM-Website gibt es apt-Pakete Ссылка und ich habe diese zur Installation von 3.9 verwendet. Diese Pakete scheinen jedoch libc ++ nicht zu enthalten. Ich installiere das libc ++ - dev Paket, aber das scheint eine wirklich alte Version zu sein. Es gibt auch Binärdateien, die Ссылка heruntergeladen werden können. Diese scheinen libc ++ zu enthalten, aber ich bin nicht sicher, ob ich nur Bits davon in Orte wie / usr / include / c ++ / v1 kopieren kann, tatsächlich bin ich nicht wirklich sicher, welche Bits ich kopieren müsste. Ich bin mir bewusst, dass ich libc ++ von einem anderen Ort verwenden kann, wie hier dokumentiert Ссылка , was ich versucht habe. Allerdings kann ich das Build-System der großen Codebasis, an der ich arbeite, nicht ändern.
Es gibt also drei Gründe, warum die apt-Pakete libc ++ nicht enthalten und alle Hinweise zur Installation einer Binärdatei werden dankbar angenommen.
Ich hatte ein ähnliches Problem wie Sie. Während das Testen von clash mit libstdc ++ mit C ++ 11 und C ++ 14 gut funktionierte, konnte es immer noch zu Lizenzproblemen mit libstdc ++ kommen. Also habe ich Clang Toolchain aus ihren Repos installiert und libc ++ unter Ubuntu 16.04 kompiliert.
Disclaimer: Dieser Post ist eine Zusammenfassung der langen Suche, wie man das libc++
unter Ubuntu Linux erstellt. Viele der Beiträge, die ich im Jahr 2017 gefunden habe, waren entweder veraltet oder beschrieben eine teilweise Lösung auf anderen Systemen, z. CentOS. Links zu diesen Beiträgen sind:
Hier sind die Schritte, um LLVM + Clang + libc ++ von der Version 4.0 zu haben:
Installieren Sie den Schlüssel von LLVM-Repositories
# apt-get update && apt-get dist-upgrade -y && apt-get install -y vim curl && \
curl -q http://apt.llvm.org/llvm-snapshot.gpg.key |apt-key add -
Erstellen Sie eine neue neue APT-Repository-Datei (Sie können auch zwei Zeilen ausschließen, die sich auf v3.9-Repos beziehen)
# cat > /etc/apt/sources.list.d/llvm-repos.list <<EOF
deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial main
deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial main
deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.9 main
deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-3.9 main
deb http://apt.llvm.org/xenial/ llvm-toolchain-xenial-4.0 main
deb-src http://apt.llvm.org/xenial/ llvm-toolchain-xenial-4.0 main
EOF
Installieren Sie Clang und alle Pakete, die zum Erstellen von libc ++ aus LLVM-Repositorys erforderlich sind
# apt-get update && apt-get install -y clang-4.0 clang-4.0-doc \
libclang-common-4.0-dev libclang-4.0-dev libclang1-4.0 libclang1-4.0-dbg \
libllvm4.0 libllvm4.0-dbg lldb-4.0 llvm-4.0 llvm-4.0-dev llvm-4.0-runtime \
clang-format-4.0 python-clang-4.0 liblldb-4.0-dev lld-4.0 libfuzzer-4.0-dev \
subversion cmake
Erstellen Sie eine Alternative für C ++ - Compiler und -Linker. Dies ist kein Muss, aber Sie können Compiler oder Linker bei Bedarf wechseln. Auch einige Build-Dateien benötigten cc
oder c++
oder clang++
, soweit ich mich erinnere. Beachten Sie, dass wir standardmäßig zu LLD Linker wechseln:
update-alternatives --install /usr/bin/cc cc /usr/bin/clang-4.0 100 \
&& update-alternatives --install /usr/bin/c++ c++ /usr/bin/clang++-4.0 100 \
&& update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-4.0 100 \
&& update-alternatives --install /usr/bin/clang clang /usr/bin/clang-4.0 100 \
&& update-alternatives --install /usr/bin/ld ld /usr/bin/ld.lld-4.0 10 \
&& update-alternatives --install /usr/bin/ld ld /usr/bin/ld.gold 20 \
&& update-alternatives --install /usr/bin/ld ld /usr/bin/ld.bfd 30 \
&& ld --version && echo 3 | update-alternatives --config ld && ld --version
Überprüfen Sie die Quellen von libc++
und libc++abi
:
$ cd /tmp
$ svn co http://llvm.org/svn/llvm-project/libcxx/branches/release_40/ libcxx
$ svn co http://llvm.org/svn/llvm-project/libcxxabi/branches/release_40/ libcxxabi
$ mkdir -p libcxx/build libcxxabi/build
Um libc++
unter Linux auszuführen, benötigt man eine ABI-Kompatibilität zu der Standardbibliothek, z.B. libstdc ++. Hier kommt libc++abi
ins Spiel. Das einzige Problem ist, dass libc++
auf dem System sein muss, für das es erstellt wurde. Somit ist libc++
in 2 Schritten aufgebaut. Erstens: ohne ABI-Kompatibilität. Aber es wird für das Bootstrapping von ABI-lib verwendet und als der zweite Schritt ist es, libc++
mit dem richtigen ABI auf dem System neu zu kompilieren:
Bootstraping = & gt; bilde libc++
ohne richtiges ABI:
cd /tmp/libcxx/build
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_CONFIG_PATH=/usr/bin/llvm-config-4.0\
-DCMAKE_INSTALL_PREFIX=/usr .. \
&& make install
Building libc++abi
mit libstdc++
kompatibel ABI:
cd /tmp/libcxxabi/build
CPP_INCLUDE_PATHS=
echo | c++ -Wp,-v -x c++ - -fsyntax-only 2>&1 \
|grep ' /usr'|tr '\n' ' '|tr -s ' ' |tr ' ' ';'
CPP_INCLUDE_PATHS="/ usr / include / c ++ / v1 /; $ CPP_INCLUDE_PATHS"
cmake -G "Unix-Makefiles" -DLIBCXX_CXX_ABI = libstdc ++ \
-DLIBCXX_LIBSUPCXX_INCLUDE_PATHS="$ CPP_INCLUDE_PATHS" \
-DMAKE_BUILD_TYPE = Freigabe -DCMAKE_INSTALL_PREFIX = / usr \
-DLLVM_CONFIG_PATH = / usr / bin / llvm-config-4.0 \
-DLIBCXXABI_LIBCXX_INCLUDES = .. / .. / libcxx / include ..
make install
Erstellen Sie libc++
mit der richtigen ABI-Lib, die auf dem System implementiert ist:
cd /tmp/libcxx/build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr \
-DLIBCXX_CXX_ABI=libcxxabi -DLLVM_CONFIG_PATH=/usr/bin/llvm-config-4.0\
-DLIBCXX_CXX_ABI_INCLUDE_PATHS=../../libcxxabi/include .. \
&& make install
Erstellen Sie eine Testdatei, um zu prüfen, ob alles in Ordnung ist. IMO sollten Sie auch cerr
stream testen, da es zuvor nicht mit dem libc++abi
unterstützt wurde und es einige segfaults gab. Siehe diese Frage .
Erstellen Sie eine test.cpp-Datei:
#include <iostream>
int main()
{
using namespace std;
cout << "[OK] Hello world to cout!" << endl;
cerr << "[OK] Hello world to cerr!" << endl;
clog << "[OK] Hello world to clog!" << endl;
return 0;
}
Und kompilieren Sie es und führen Sie es mit dieser Befehlszeile aus:
clang++ -std=c++11 -stdlib=libc++ -lc++abi test.cpp && ./a.out
Ich habe libc ++ Pakete für Ubuntu gefunden, aber sie sind ein bisschen hinter der letzten Version: Ссылка
Warum sie nicht aktuell sind, kann ich nicht beantworten, aber meine Vermutung ist, dass LLVM + Clang mit fast jeder Standardbibliothek funktionieren kann, während libc ++, wie Sie sehen, mit bestimmten Laufzeit-ABI verknüpft sein muss und stark von verfügbar abhängen kann C-Laufzeitbibliothek. Ich stimme zu, dass es ein Paket geben sollte, das 90% der Fälle abdeckt. Vielleicht ist dies nur der Mangel an Ressourcen. Im Mailing-Archiv suchen brachte nichts besonderes.
Der einfachste Weg, um eine funktionierende libc ++ zu erhalten, ist die Installation der gesamten 3.9.0 Toolchain unter /usr/local
. Dies erlaubt / usr / local / bin / clang ++, die Header korrekt zu finden und dem Linker auch die Möglichkeit zu geben, / usr / local / lib / libc ++. So.