【发布时间】:2015-10-21 08:01:14
【问题描述】:
我正在 OS X Yosemite 上基于 clang 和 llvm 构建一个简单的解析器(用 c++ 编写以扩展 clang AST)。我在我的主目录中下载了 clang 和 llvm 源(~/clang-llvm/llvm 是源,~/clang-llvm/build 是构建目录)并使用 cmake & make 构建它们。
例如,一个示例解析器包括如下的 clang 源文件:
#include "clang/AST/AST.h"
#include "clang/AST/ASTConsumer.h"
#include "clang/ASTMatchers/ASTMatchers.h"
#include "clang/ASTMatchers/ASTMatchFinder.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/FrontendActions.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
#include "clang/Rewrite/Core/Rewriter.h"
#include "llvm/Support/raw_ostream.h"
使用 clang 的 AST 匹配功能。但是当我尝试使用 clang++ 编译它时,出现如下错误
Undefined symbols for architecture x86_64:
"llvm::RefCountedBaseVPTR::anchor()", referenced from:
vtable for clang::ast_matchers::internal::matcher_isPublicMatcher in matchers_rewriter-b01682.o
vtable for clang::ast_matchers::internal::matcher_isProtectedMatcher in matchers_rewriter-b01682.o
vtable for clang::ast_matchers::internal::matcher_isPrivateMatcher in matchers_rewriter-b01682.o
vtable for clang::ast_matchers::internal::matcher_isImplicitMatcher in matchers_rewriter-b01682.o
vtable for clang::ast_matchers::internal::matcher_ignoringImpCasts0Matcher in matchers_rewriter-b01682.o
vtable for clang::ast_matchers::internal::matcher_ignoringParenCasts0Matcher in matchers_rewriter-b01682.o
vtable for clang::ast_matchers::internal::matcher_ignoringParenImpCasts0Matcher in matchers_rewriter-b01682.o
...
"llvm::cl::OptionCategory::registerCategory()", referenced from:
llvm::cl::OptionCategory::OptionCategory(char const*, char const*) in matchers_rewriter-b01682.o
"llvm::outs()", referenced from:
<<OMITTED>>
"typeinfo for clang::ASTFrontendAction", referenced from:
typeinfo for MyFrontendAction in matchers_rewriter-b01682.o
"typeinfo for clang::tooling::FrontendActionFactory", referenced from:
typeinfo for std::__1::unique_ptr<clang::tooling::FrontendActionFactory, std::__1::default_delete<clang::tooling::FrontendActionFactory> > clang::tooling::newFrontendActionFactory<MyFrontendAction>()::SimpleFrontendActionFactory in matchers_rewriter-b01682.o
"vtable for llvm::RefCountedBaseVPTR", referenced from:
llvm::RefCountedBaseVPTR::RefCountedBaseVPTR() in matchers_rewriter-b01682.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for clang::ASTConsumer", referenced from:
clang::ASTConsumer::ASTConsumer() in matchers_rewriter-b01682.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for clang::ast_matchers::MatchFinder::MatchCallback", referenced from:
clang::ast_matchers::MatchFinder::MatchCallback::MatchCallback() in matchers_rewriter-b01682.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for clang::ASTFrontendAction", referenced from:
clang::ASTFrontendAction::ASTFrontendAction() in matchers_rewriter-b01682.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for clang::tooling::ToolAction", referenced from:
clang::tooling::ToolAction::ToolAction() in matchers_rewriter-b01682.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
"vtable for clang::tooling::FrontendActionFactory", referenced from:
clang::tooling::FrontendActionFactory::FrontendActionFactory() in matchers_rewriter-b01682.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
我使用如下编译选项
clang++ -fno-rtti -O0 -std=c++11 -g -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS `/Users/me/clang-llvm/build/Debug+Asserts/bin/llvm-config --cxxflags`
编译器似乎需要 clang & llvm 的 .o 或 .a 文件。我是否需要提供更多选项或指定它们的任何路径?我尝试在存在已编译文件的位置添加-I /Users/me/clang-llvm/build/Debug+Asserts/lib,但它也不起作用。
【问题讨论】:
标签: c++ macos clang llvm clang++