2016-05-10 15 views
0

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 ..

Antwort

1

Ich habe den Wert des $ ORIGIN Variable nicht gerade jetzt. Ich bin mir nicht sicher, wie ich das herausfinden soll.

$ORIGIN keine Variable ist, ist es ein besonderes Zeichen, das in DT_RPATH-Tags enthalten sein kann, den dynamischen Linker zu sagen, für gemeinsam genutzte Bibliotheken von der Stelle der binären Suche zu starten, die sie erfordert. Deshalb wird es als "\$ORIGIN" maskiert, um zu verhindern, dass die Shell es als Shell-Variable behandelt. Sie können das jetzt ignorieren, da es nur zur Laufzeit zählt und Ihr Fehler bei der Verbindungszeit liegt.

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.

Richtig. Diese Symbole befinden sich in der Bibliothek libstdC++. So (und libstdC++. A).

ich versuchte, explizit die Compiler in die GCC-Bibliothek zu schieben, indem die oben -L Flagge mit -L/opt/crtdc/gcc/4.8.5-4/lib64/ ersetzen. Hat nicht funktioniert; gleicher Fehler

Es ist nicht genug, um zu sagen, wo die Bibliotheken sind, müssen Sie es sagen, um tatsächlich mit der relevanten Bibliothek zu verknüpfen. Versuchen Sie das Hinzufügen -lstdc++

+0

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

+0

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). –

+0

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