Ich versuche, LLVM 3.8 (nur grundlegende LLVM nicht Clang, etc) mit dem 2016 Intel C++ - Compiler Icpc (ICC) 16.0.2 20160204 zu bauen. Der Build-Host Läuft Red Hat Linux.undefined Verweis auf Std :: __ Detail :: _ List_node_base :: Swap
Das erste, was ich sah, waren nicht aktuelle C++ 11-Header für den Intel-Compiler. Dies könnte durch Verwendung der GCC 4.8.5 C++ - Header behoben werden. (Beachten Sie, dass Intel-Compiler für die Zusammenarbeit mit der GCC-Toolchain konzipiert sind.)
Jetzt kommt ein gewisser Fortschritt in den Build [12% oder so] zum Erstellen und Verknüpfen der ausführbaren Datei tblgen. Dieses Tool und seine Ausführung wird während des weiteren Builds benötigt. Leider dieses Tool Verknüpfung fehlschlägt:
CMakeFiles/obj.llvm-tblgen.dir/CodeGenRegisters.cpp.o: In function `std::list<llvm::CodeGenRegisterClass, std::allocator<llvm::CodeGenRegisterClass> >::swap(std::list<llvm::CodeGenRegisterClass, std::allocator<llvm::CodeGenRegisterClass> >&)':
/opt/crtdc/gcc/4.8.5-4/include/c++/4.8.5/bits/stl_list.h:1212: undefined reference to `std::__detail::_List_node_base::swap(std::__detail::_List_node_base&, std::__detail::_List_node_base&)'
CMakeFiles/obj.llvm-tblgen.dir/CodeGenRegisters.cpp.o: In function `std::list<llvm::CodeGenRegisterClass, std::allocator<llvm::CodeGenRegisterClass> >::_M_transfer(std::_List_iterator<llvm::CodeGenRegisterClass>, std::_List_iterator<llvm::CodeGenRegisterClass>, std::_List_iterator<llvm::CodeGenRegisterClass>)':
/opt/crtdc/gcc/4.8.5-4/include/c++/4.8.5/bits/stl_list.h:1546: undefined reference to `std::__detail::_List_node_base::_M_transfer(std::__detail::_List_node_base*, std::__detail::_List_node_base*)'
CMakeFiles/obj.llvm-tblgen.dir/CodeGenRegisters.cpp.o: In function `void std::list<llvm::CodeGenRegisterClass, std::allocator<llvm::CodeGenRegisterClass> >::_M_insert<llvm::CodeGenRegBank&, llvm::Record*&>(std::_List_iterator<llvm::CodeGenRegisterClass>, llvm::CodeGenRegBank&&&, llvm::Record*&&&)':
/opt/crtdc/gcc/4.8.5-4/include/c++/4.8.5/bits/stl_list.h:1562: undefined reference to `std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)'
CMakeFiles/obj.llvm-tblgen.dir/CodeGenRegisters.cpp.o: In function `void std::list<llvm::CodeGenRegisterClass, std::allocator<llvm::CodeGenRegisterClass> >::_M_insert<llvm::CodeGenRegBank&, llvm::StringRef&, llvm::CodeGenRegisterClass::Key&>(std::_List_iterator<llvm::CodeGenRegisterClass>, llvm::CodeGenRegBank&&&, llvm::StringRef&&&, llvm::CodeGenRegisterClass::Key&&&)':
/opt/crtdc/gcc/4.8.5-4/include/c++/4.8.5/bits/stl_list.h:1562: undefined reference to `std::__detail::_List_node_base::_M_hook(std::__detail::_List_node_base*)'
Der Befehl Linker an diese führt, ist (ich Zeilenumbrüche zur besseren Lesbarkeit hinzugefügt Es ist ein Befehl wirklich.)
/opt/intel/compiler/2016u2/compilers_and_libraries_2016.2.181/linux/bin/intel64/icpc
-cxxlib=/opt/crtdc/gcc/4.8.5-4/
-std=c++11
-fPIC
-fvisibility-inlines-hidden
-g
-Wl,-allow-shlib-undefined
CMakeFiles/obj.llvm-tblgen.dir/AsmMatcherEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/AsmWriterEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/AsmWriterInst.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/Attributes.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/CallingConvEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/CodeEmitterGen.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/CodeGenDAGPatterns.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/CodeGenInstruction.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/CodeGenMapTable.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/CodeGenRegisters.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/CodeGenSchedule.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/CodeGenTarget.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/DAGISelEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcherEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcherGen.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcherOpt.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcher.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/DFAPacketizerEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/DisassemblerEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/FastISelEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/FixedLenDecoderEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/InstrInfoEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/IntrinsicEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/OptParserEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/PseudoLoweringEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/RegisterInfoEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/SubtargetEmitter.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/TableGen.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/X86DisassemblerTables.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/X86ModRMFilters.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/X86RecognizableInstr.cpp.o
CMakeFiles/obj.llvm-tblgen.dir/CTagsEmitter.cpp.o
-o ../../bin/llvm-tblgen
-L/usr/lib/gcc/x86_64-redhat-linux/4.4.7
../../lib/libLLVMSupport.a
../../lib/libLLVMTableGen.a
../../lib/libLLVMSupport.a
-lrt
-ldl
-ltinfo
-lpthread
-lz
-lm
-Wl,-rpath,"\$ORIGIN/../lib"
Ich habe nicht den Wert des $ORIGIN
momentan variabel. Ich bin mir nicht sicher, wie ich das herausfinden soll. (Der Befehl wurde beim Aufruf von make VERBOSE = 1 ausgedruckt).
Was das -cxxlib=/opt/crtdc/gcc/4.8.5-4/
Flag tut, ist ICCC Query GCC für den Speicherort der C++ - Header-Dateien und verwenden Sie sie.
Die Linker-Fehlermeldung sagt mir (ich kann falsch liegen), dass die GCC C++ - Header-Dateien gefunden und verwendet wurden, aber irgendwie wurde der kompilierte Teil der Bibliothek nicht gefunden.
Ich habe versucht, den Compiler explizit in die GCC-Bibliothek zu schieben, indem ich das obige -L-Flag durch -L/opt/crtdc/gcc/4.8.5-4/lib64/ersetze. Hat nicht funktioniert; gleicher Fehler
Ich schaute dann in die Datei CodeGenRegisters.cpp und extrahiert alle Verwendungen von Std :: Swap in separate, kleine, stand-alone-Beispiele, um zu sehen, ob ich diesen Linker-Fehler reproduzieren kann. Nein, für die kleinen Beispiele lief alles gut. (... und ich habe dafür die GCC-Header verwendet, um den Fall realistisch zu gestalten).
Ich habe gehofft, eine Eingabe hier zu bekommen ..
Ich fügte '-lstdC++' einmal mit '-L/usr/lib/gcc/x86_64-redhat-linux/4.4.7' (das ist das Original) und mit' -L/opt/crtdc/gcc/4.8.5-4/lib64/'(das ist mein Ersatz). Gleiche Fehlermeldung, keine Änderungen. – ritter
Sie müssen die Bibliothek verwenden, die den Headern entspricht. Sie können nicht erwarten, dass es sonst funktioniert. Was ist dein volles Kommando? Hast du '-lstdC++' hinter die Objekte und andere Bibliotheken gelegt, die verlinkt sind? Passt '/opt/crtdc/gcc/4.8.5-4/lib64/libstdC++. *' Zu irgendwelchen Dateien? Schließlich können Sie versuchen, dem Linker-Befehl "-Wl, -t" hinzuzufügen, um genau zu sehen, welche Dateien der Linker gerade verarbeitet (es könnte das alte libstdC++ zuerst sehen, also niemals das neuere). –
Sie haben es geschafft zu arbeiten, dank Ihrer Hinweise! Die Lösung besteht darin, -lstdC++ und -L vor allen Objektdateien zu setzen. Dann funktioniert die Verknüpfung gut. Nun muss ich das nur dem CMake-Konfigurationsprozess mitteilen: diese Compiler-Flags vor alle zu setzen .. wahrscheinlich nicht so einfach ..: -/ – ritter