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)