связывание с библиотеками clang / llvm 3.0 - PullRequest
2 голосов
/ 08 декабря 2011

Я играл с clang / llvm 3.0, следуя инструкциям здесь http://amnoid.de/tmp/clangtut/tut.html

Код в руководстве немного устарел, но после некоторой модификации он компилируется нормально (оба с clang ++ /g ++, в Ubuntu):

#include <llvm/Support/raw_ostream.h>
#include <llvm/Support/Host.h>
#include <llvm/ADT/IntrusiveRefCntPtr.h>

#include <clang/Frontend/DiagnosticOptions.h>
#include <clang/Frontend/TextDiagnosticPrinter.h>
#include <clang/Frontend/CompilerInstance.h>

#include <clang/Basic/Diagnostic.h>
#include <clang/Basic/TargetOptions.h>
#include <clang/Basic/TargetInfo.h>
#include <clang/Basic/FileManager.h>

#include <clang/Lex/Preprocessor.h>
#include <clang/Lex/HeaderSearch.h>

using namespace clang;

int main()
{
  DiagnosticOptions diagOpt;
  TextDiagnosticPrinter *pTextDiagPrinter = new TextDiagnosticPrinter(llvm::outs(), diagOpt);
  llvm::IntrusiveRefCntPtr<DiagnosticIDs> pDiagIds(new DiagnosticIDs);
  DiagnosticsEngine *pDiagEng = new DiagnosticsEngine(pDiagIds, pTextDiagPrinter);
  Diagnostic diag(pDiagEng);

  LangOptions lang;
  FileSystemOptions fmOpt;
  FileManager fm(fmOpt);
  SourceManager sm(*pDiagEng, fm);
  HeaderSearch headers(fm);
  TargetOptions tgtOpt;
  tgtOpt.Triple = llvm::sys::getHostTriple();

  TargetInfo *ti = TargetInfo::CreateTargetInfo(*pDiagEng, tgtOpt);
  CompilerInstance comp;

  Preprocessor pp(*pDiagEng, lang, ti, sm, headers, comp);

  return 0;
}

Проблема заключается в компоновке, я думаю, проблема в порядке библиотек, пробовал различные комбинации, некоторые дают тысячи неопределенных символов, лучшее, что я получаю, это:

g++ -fno-exceptions -fno-rtti -fno-common \
-lclangParse -lclangSerialization -lclangDriver -lclangSema -lclangAnalysis -lclangAST -lclangFrontend \
-lclangLex -lclangBasic -lclang \
`llvm-config --cxxflags --ldflags --libs` -ldl tut1.cpp

, что дает

tut1.cpp:(.text.startup+0xca): undefined reference to `llvm::outs()'
tut1.cpp:(.text.startup+0xef): undefined reference to `clang::TextDiagnosticPrinter::TextDiagnostic
Printer(llvm::raw_ostream&, clang::DiagnosticOptions const&, bool)'
tut1.cpp:(.text.startup+0x104): undefined reference to `clang::DiagnosticIDs::DiagnosticIDs()'
tut1.cpp:(.text.startup+0x13d): undefined reference to `clang::DiagnosticsEngine::DiagnosticsEngine
(llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> const&, clang::DiagnosticConsumer*, bool)'
tut1.cpp:(.text.startup+0x14a): undefined reference to `clang::LangOptions::LangOptions()'
tut1.cpp:(.text.startup+0x167): undefined reference to `clang::FileManager::FileManager(clang::File
SystemOptions const&)'
tut1.cpp:(.text.startup+0x17f): undefined reference to `clang::SourceManager::SourceManager(clang::
DiagnosticsEngine&, clang::FileManager&)'
tut1.cpp:(.text.startup+0x194): undefined reference to `clang::HeaderSearch::HeaderSearch(clang::Fi
leManager&)'
tut1.cpp:(.text.startup+0x1f5): undefined reference to `llvm::sys::getHostTriple()'
tut1.cpp:(.text.startup+0x227): undefined reference to `clang::TargetInfo::CreateTargetInfo(clang::
DiagnosticsEngine&, clang::TargetOptions&)'
tut1.cpp:(.text.startup+0x232): undefined reference to `clang::CompilerInstance::CompilerInstance()
'
tut1.cpp:(.text.startup+0x277): undefined reference to `clang::Preprocessor::Preprocessor(clang::Di
agnosticsEngine&, clang::LangOptions&, clang::TargetInfo const*, clang::SourceManager&, clang::Head
erSearch&, clang::ModuleLoader&, clang::IdentifierInfoLookup*, bool, bool)'
tut1.cpp:(.text.startup+0x281): undefined reference to `clang::Preprocessor::~Preprocessor()'
tut1.cpp:(.text.startup+0x289): undefined reference to `clang::CompilerInstance::~CompilerInstance(
)'
tut1.cpp:(.text.startup+0x2e4): undefined reference to `clang::HeaderSearch::~HeaderSearch()'
tut1.cpp:(.text.startup+0x2f1): undefined reference to `clang::SourceManager::~SourceManager()'
tut1.cpp:(.text.startup+0x2fe): undefined reference to `clang::FileManager::~FileManager()'
tut1.cpp:(.text.startup+0x345): undefined reference to `clang::DiagnosticIDs::~DiagnosticIDs()'
collect2: ld returned 1 exit status

Я также перешел по этой ссылке Связывание с clang-llvm , но, похоже, это не относится к clang 3.0.

Кто-нибудь знает, как успешно создать код или, еще лучше, какой-нибудь инструмент, например, clang-config?

Ответы [ 3 ]

3 голосов
/ 29 марта 2012

просто используйте флаги LLVM ПОСЛЕ .o файла, объектный файл не будет связан, пока флаги не будут записаны после него.Простой make-файл, чтобы показать, что я имею в виду

CC=clang++
LFLAGS=`llvm-config --cppflags --ldflags --libs core`
all:
    $(CC) -o out in.cc $(FLAGS)
0 голосов
/ 09 декабря 2011

Некоторые линкеры чувствительны к порядку флагов -l * при работе со статическими библиотеками. Библиотеки clang выглядят нормально, поэтому попробуйте заменить `llvm-config --cxxflags --ldflags --libs` на список библиотек clang.

Если это не поможет, единственное решение для вас - это то, что предложила @ SK-logic - запустите make -n и посмотрите на команду компиляции для цели clang.

0 голосов
/ 08 декабря 2011

clang сам драйвер связывается с:

-lclangFrontendTool -lclangFrontend -lclangDriver -lclangSerialization -lclangCodeGen -lclangParse -lclangSema -lclangStaticAnalyzerFrontend -lclangStaticAnalyzerCheckers -lclangStaticAnalyzerCore -lclangAnalysis -lclangIndex -lclangARCMigrate -lclangRewrite -lclangAST -lclangLex -lclangBasic

Небольшой трюк, как это выяснить: собрать clang, удалить двоичный файл clang и запустить make -n.

...