<div dir="ltr">Hi Douglas, <div><br></div><div>Thanks very much for your answer! It works find for the simple foo.cpp with these libraries. But when I try to expend it a little bit using RefactoringTool to match the if statement, it seems to need more libraries. </div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)"><br></font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)"><div>#include <stdio.h></div><div>#include <string></div><div>#include <vector></div><div>#include <system_error></div><div>#include <type_traits></div><div>#include "clang/AST/AST.h"</div><div>#include "clang/Frontend/TextDiagnosticPrinter.h"</div><div>#include "clang/Tooling/CommonOptionsParser.h"</div><div>#include "clang/ASTMatchers/ASTMatchers.h"</div><div>#include "clang/ASTMatchers/ASTMatchFinder.h"</div><div>#include "clang/Basic/SourceManager.h"</div><div>#include "clang/Frontend/FrontendActions.h"</div><div>#include "clang/Lex/Lexer.h"</div><div>#include "clang/Tooling/CompilationDatabase.h"</div><div>#include "clang/Tooling/Refactoring.h"</div><div>#include "clang/Tooling/Tooling.h"</div><div>#include "llvm/ADT/Twine.h"</div><div>#include "llvm/Support/CommandLine.h"</div><div>#include "llvm/Support/MemoryBuffer.h"</div><div>#include "llvm/Support/Path.h"</div><div>#include "llvm/Support/Signals.h"</div><div>#include "llvm/Support/raw_ostream.h"</div><div><br></div><div><br></div><div>using namespace llvm;</div><div>using clang::tooling::newFrontendActionFactory;</div><div>using clang::tooling::Replacement;</div><div>using clang::tooling::CompilationDatabase;</div><div>using namespace clang;</div><div>using namespace clang::ast_matchers;</div><div>using namespace clang::driver;</div><div>using namespace clang::tooling;</div><div><br></div><div>static llvm::cl::OptionCategory ToolingSampleCategory("IfStmt");</div></font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)"><br></font></div><div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">class IfStmtHandler : public MatchFinder::MatchCallback {</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">public:</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">  IfStmtHandler(Replacements *Replace) : Replace(Replace) {}</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)"><br></font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">  virtual void run(const MatchFinder::MatchResult &Result) {</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">    // The matched 'if' statement was bound to 'ifStmt'.</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">    if (const IfStmt *IfS = Result.Nodes.getNodeAs<clang::IfStmt>("ifStmt")) {</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">      IfS->dump();</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">    }</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">  }</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">private:</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">  Replacements *Replace;</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,255)">};</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)"><br></font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)"><br></font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">int main(int argc, const char **argv) {</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">  printf("Removing all ColIt<>...\n");</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">  CommonOptionsParser op(argc, argv, ToolingSampleCategory);</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">  std::vector<std::string> sources({</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">    "/Users/hwang/dev/code/tcaddin/Chart/ChartSE.cpp"});</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">  RefactoringTool Tool(op.getCompilations(), sources);</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">  // Set up AST matcher callbacks.</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">  IfStmtHandler HandlerForIf(&Tool.getReplacements());</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)"><br></font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">  MatchFinder Finder;</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">  Finder.addMatcher(ifStmt().bind("ifStmt"), &HandlerForIf);</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">  return 0;</font></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">}</font></div></div><div><font face="monospace, monospace" style="background-color:rgb(255,255,0)"><br></font></div>error messages:<div><font face="monospace, monospace"><br></font></div><font face="monospace, monospace" style="background-color:rgb(255,255,0)">Undefined symbols for architecture x86_64:<br>  "clang::tooling::RefactoringTool::getReplacements()", referenced from:<br>      _main in foo-06331f.o<br>  "clang::tooling::RefactoringTool::RefactoringTool(clang::tooling::CompilationDatabase const&, llvm::ArrayRef<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >, std::__1::shared_ptr<clang::PCHContainerOperations>)", referenced from:<br>      _main in foo-06331f.o<br>  "clang::tooling::CommonOptionsParser::CommonOptionsParser(int&, char const**, llvm::cl::OptionCategory&, char const*)", referenced from:<br>      _main in foo-06331f.o<br>  "clang::tooling::ClangTool::~ClangTool()", referenced from:<br>      clang::tooling::RefactoringTool::~RefactoringTool() in foo-06331f.o<br>  "vtable for clang::RawPCHContainerOperations", referenced from:<br>      clang::RawPCHContainerOperations::RawPCHContainerOperations() in foo-06331f.o<br>  NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.<br>ld: symbol(s) not found for architecture x86_64<br>clang: error: linker command failed with exit code 1 (use -v to see invocation)</font></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 8, 2015 at 7:45 PM, Douglas Katzman <span dir="ltr"><<a href="mailto:dougk@google.com" target="_blank">dougk@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra">Sounds like you're not linking against the necessary libraries, and you didn't add "-fno-rtti" to the cc command.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Try compiling this minimal 'foo.cpp' program:</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">#include "clang/ASTMatchers/ASTMatchFinder.h"</div><div class="gmail_extra">#include "clang/ASTMatchers/ASTMatchers.h"</div><div class="gmail_extra">int main() { return 0; }<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">% g++ -fno-rtti -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -std=c++11 -g -Iinclude -Itools/clang/include -I../src/include -I../src/tools/clang/include -c foo.cpp</div><div class="gmail_extra"><br></div><div class="gmail_extra"><div class="gmail_extra">% g++ -o foo foo.o \</div><div class="gmail_extra">  ../build/lib/libclangAST.a \</div><div class="gmail_extra">  ../build/lib/libclangASTMatchers.a \</div><div class="gmail_extra">  ../build/lib/libclangLex.a ../build/lib/libclangBasic.a \</div><div class="gmail_extra">  ../build/lib/libLLVMSupport.a \</div><div class="gmail_extra">  -lpthread -ldl -lncurses</div></div></div></div>
</blockquote></div><br></div>