CommonOptionsParser 中的一个奇怪的错误

0 clang

我是 Clang 的新学习者,遇到了一个奇怪的错误。

我的代码是一个简单的案例:

..... 
static llvm::cl::OptionCategory MyToolCategory(""); 
..... 
int main(int argc, const char **argv) 
{ 
  CommonOptionsParser OptionsParser(argc, argv, MyToolCategory); 
  ClangTool Tool(OptionsParser.getCompilations(), 
                 OptionsParser.getSourcePathList()); 
  tooling::MyFactory Factory; 
  Tool.run(newFrontendActionFactory(&Factory)); 
  return 0; 
} 
Run Code Online (Sandbox Code Playgroud)

但使用 clang++ 编译时报告一个非常奇怪的错误(我的 llvm&clang 版本是 3.4):

ToolingTutorial.cpp:74:23: error: no matching constructor for initialization of 'clang::tooling::CommonOptionsParser' 
  CommonOptionsParser OptionsParser(argc, argv, MyToolCategory); 
                      ^             ~~~~~~~~~~~~~~~~~~~~~~~~~~ 
/home/acsa-amd2/Documents/llvm-3.4/tools/clang/include/clang/Tooling/CommonOptionsParser.h:67:3: note: candidate constructor not 
      viable: no known conversion from 'llvm::cl::OptionCategory' to 'const char *' for 3rd argument 
  CommonOptionsParser(int &argc, const char **argv, const char *Overview = 0); 
  ^ 
/home/acsa-amd2/Documents/llvm-3.4/tools/clang/include/clang/Tooling/CommonOptionsParser.h:61:7: note: candidate constructor 
      (the implicit move constructor) not viable: requires 1 argument, but 3 were provided 
class CommonOptionsParser { 
      ^ 
/home/acsa-amd2/Documents/llvm-3.4/tools/clang/include/clang/Tooling/CommonOptionsParser.h:61:7: note: candidate constructor 
      (the implicit copy constructor) not viable: requires 1 argument, but 3 were provided 
1 error generated. 
make: *** [ToolingTutorial.o] Error 1 
Run Code Online (Sandbox Code Playgroud)

构造函数不匹配并且编译器将 'llvm::cl::OptionCategory' 错误为 'const char *' 是没有意义的。有人遇到这个问题吗?谢谢!

小智 5

在最新的 LLVM14 中,CommonOptionsParser的构造函数被声明为 protected 或 private。因此,将这些函数替换为create(...).

llvm::Expected<clang::tooling::CommonOptionsParser> option = CommonOptionsParser::create(argc, argv, FindDeclCategory, llvm::cl::OneOrMore, FindDeclUsage);

auto files = option->getSourcePathList();

clang::tooling::ClangTool tool(option->getCompilations(), files);

return tool.run(clang::tooling::newFrontendActionFactory<DeclFindingAction>().get());
Run Code Online (Sandbox Code Playgroud)