C++ 注册叮当声检查器时出错:“quot;“寄存器”的定义不一致;

C++ 注册叮当声检查器时出错:“quot;“寄存器”的定义不一致;,c++,clang,clang-static-analyzer,C++,Clang,Clang Static Analyzer,我正在尝试将我自己的检查器添加到。在这之后,我做了以下工作: 在MyChecker.cpp中编写了骨架检查器: using namespace clang; using namespace ento; namespace { class MyChecker : public Checker<check::PreCall, check::PostCall,

我正在尝试将我自己的检查器添加到。在这之后,我做了以下工作:

MyChecker.cpp
中编写了骨架检查器:

using namespace clang;
using namespace ento;

namespace {
    class MyChecker : public Checker<check::PreCall,
                                     check::PostCall,
                                     check::Location> {
    public:
      void checkPreCall(const CallEvent &Call, CheckerContext &C) const;
      void checkPostCall(const CallEvent &Call, CheckerContext &C) const;
    };

}

void MyChecker::checkPreCall(const CallEvent &Call, CheckerContext &C) const {}
void MyChecker::checkPostCall(const CallEvent &Call, CheckerContext &C) const {}

void ento::registerMyChecker(CheckerManager &mgr) {
  mgr.registerChecker<MyChecker>();
}
并在Checkers.td中添加了一个条目:

def MyChecker : Checker<"MyChecker">,
  HelpText<"MyChecker">,
  DescFile<"MyChecker.cpp">;

为什么我不能注册MyChecker?

所以clang静态checker注册依赖于包含静态checker注册函数生成声明的文件-。静态检查器源文件应该包括该头文件,并实现注册函数
void ento::registerMyChecker(checkermanger&mgr)

,那么
registerMyChecker
声明在哪里?(假设代码部分来自MyChecker.cpp)它只在
void ento::registerMyChecker(checker&mgr)一行中提到
-但这是定义,而不是声明,这正是编译器的抱怨。我正在按照说明添加检查器。我不知道声明在哪里。该教程似乎缺少大约80%的说明…然后您需要将
ClangSACheckers.h
包含到文件中,以便声明可见。
def MyChecker : Checker<"MyChecker">,
  HelpText<"MyChecker">,
  DescFile<"MyChecker.cpp">;
MyChecker.cpp:30:12: error: out-of-line definition of 'registerMyChecker' does not match any declaration in namespace 'clang::ento'
void ento::registerMyChecker(CheckerManager &mgr) {
           ^~~~~~~~~~~~~~~~~
1 error generated.
ninja: build stopped: subcommand failed.