5

我一直在使用 clang/llvm 开发一个小工具,但我无法成功地让 g++ 和 gnu 的链接器正确地将我的代码与 clang 链接起来。

我的链接器正在生成以下错误:

undefined reference to `clang::FileManager::~FileManager()'

undefined reference to `clang::FileManager::FileManager()'

undefined reference to `llvm::sys::getHostTriple()'

undefined reference to `clang::Diagnostic::Diagnostic(clang::DiagnosticClient*)'

undefined reference to `llvm::outs()'

undefined reference to `clang::TargetInfo::CreateTargetInfo(clang::Diagnostic&, clang::TargetOptions&)'

undefined reference to `clang::SourceManager::getOrCreateContentCache(clang::FileEntry const*)'

undefined reference to `clang::SourceManager::createFileID(clang::SrcMgr::ContentCache const*, clang::SourceLocation, clang::SrcMgr::CharacteristicKind, unsigned int, unsigned int)'

我的编译命令如下所示:

g++ -g -fno-rtti -I~/llvm-2.8/tools/clang-2.8/include \
  -I~/llvm-2.8/llvm/include \
  `~/bin/llvm-config --cxxflags` \
  -c Frontend.cpp

g++ -g -fno-rtti -I~/llvm-2.8/tools/clang-2.8/include \
  -I~/llvm-2.8/llvm/include \
  `~/bin/llvm-config --cxxflags` \
  -c exec.cpp

g++ -I~/llvm-2.8/tools/clang-2.8/include \
    -I~/llvm-2.8/llvm/include -L~/opt/lib/ \
    -g -fno-rtti -lclangDriver -lclangAnalysis \
    -lclangFrontend -lclangSema -lclangAST -lclangParse \
    -lclangLex -lclangBasic  \
    `~/bin/llvm-config --cxxflags --ldflags --libs`  \
    Frontend.o exec.o -o run

欢迎任何提示或建议。

干杯,ct

PS:我一直在探索这个页面上的一些信息:

http://ubuntuforums.org/showthread.php?t=532693

它可能会奏效,我会在可能的情况下对该提示发表评论。

解决方案

使用本教程中的 clang 代码(必须对其进行修改以删除对 FileSystemOptions b/c clang/Basic/FileSystemOptions.h 的引用在 clang-2.8 中不存在):http ://clangtutorial.codeplex.com/

g++ tutorial1.cpp -g -fno-rtti -lclangFrontend -lclangDriver       \
    -lclangCodeGen -lclangSema -lclangChecker -lclangAnalysis      \
    -lclangRewrite -lclangAST -lclangParse -lclangLex -lclangBasic \
    -lLLVMSupport -lLLVMSystem -I~/opt/include/                    \
    `llvm-config --cxxflags --ldflags --libs all`

似乎成功了!

4

2 回答 2

7

当我针对 llvm / clang 构建了一些东西时,这就是我用来构建它的东西。也许您可以比较两条构建线。

此外,我使用的 llvm-config 命令是:llvm-config --cxxflags --ldflags --libs backend.

最后,这可能部分与订购问题有关。在包含 clang 库之前,您可能希望包含 llvm 的库。

/usr/bin/g++                                                              \
    -fno-exceptions -fno-rtti -fno-common                                 \
    -I/Users/wlynch/Homebrew/include                                      \
    -DNDEBUG -D_GNU_SOURCE -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS \
    ../src/main.cpp -c -o src/main.cpp.0.o

/usr/bin/g++
     src/main.cpp.0.o -o /Users/wlynch/Dropbox/Clang/Indexer/build/main               \
     -L/Users/wlynch/Homebrew/lib -L/Users/wlynch/Homebrew/lib                        \
     -lpthread -lm                                                                    \
     -lLLVMX86Disassembler -lLLVMX86AsmParser -lLLVMX86CodeGen -lLLVMSelectionDAG     \
     -lLLVMAsmPrinter -lLLVMMCParser -lLLVMCodeGen -lLLVMScalarOpts -lLLVMInstCombine \
     -lLLVMTransformUtils -lLLVMipa -lLLVMAnalysis -lLLVMTarget -lLLVMCore            \
     -lLLVMX86AsmPrinter -lLLVMMC -lLLVMX86Info -lLLVMSupport -lLLVMSystem            \
     -lclangAST -lclangAnalysis -lclangBasic -lclangChecker -lclangCodeGen            \
     -lclangDriver -lclangFrontend -lclangFrontendTool -lclangIndex -lclangLex        \
     -lclangParse -lclangRewrite -lclangSema -lclangSerialization
于 2010-12-15T15:27:35.397 回答
4

我假设您在 ~/bin/llvm-config 周围有反引号,对吗?

话虽如此,移动 -l 选项和

`~/bin/llvm-config --cxxflags --ldflags --libs`

在命令行上的 .o 文件之后。除非前面的目标文件引用,否则不会从库中取出东西。

于 2010-12-15T15:06:12.057 回答