无法识别 GMock 宏? YCM 给我错误,但 Bazel 构建良好

GMock macros not recognized? YCM gives me error, but Bazel builds fine

我正在使用 YCM 为我的 Vim 设置提供错误检查。它在我使用 MOCK_METHOD 时抛出错误说 "C++ requires a type specifier for all declarations",但 Bazel 构建得很好。我想我缺少某种标志?

这哥们有同样的问题但是没有return给出答案:

https://github.com/ycm-core/YouCompleteMe/issues/1332

从对方的回复来看,我知道这是我的 YCM 配置问题,所以我检查了一下,但无济于事。

这是简单的代码

#include <netinet/in.h>
#include <gmock/gmock.h>
#include <string>
#include "socket_helper.h"

namespace Proj {

class MockSocketHelper : public SocketHelper {
 public:
  MOCK_METHOD(ssize_t, write, (std::string msg), (override));
  MOCK_METHOD(std::string, read, (size_t n_bytes), (override));
};

在 MOCK_METHOD 我得到 "C++ requires a type specifier for all declarations",这告诉我它不识别宏。

这是我的 ycmd 配置中的基本标志:

BASE_FLAGS = [
        '-Wall',
        '-Wextra',
        '-Werror',
        '-Wno-long-long',
        '-Wno-variadic-macros',
        '-fexceptions',
        '-ferror-limit=10000',
        '-DNDEBUG',
        '-std=c++11',
        '-xc++',
        '-I/usr/lib/',
        '-I/usr/src/googletest/googletest/libgtest.a',
        '-I/usr/src/googletest/googletest/libgtest_main.a',
        '-isystem /usr/src/googletest/googletest/libgtest.a',
        '-isystem /usr/src/googletest/googletest/libgtest_main.a',
        '-I/usr/include/'
        ]

如您所见,我尝试链接 libgtest.a 但无济于事。我做错了什么?

-I 标志指定包含文件的位置。

您不应列出已编译库的路径,而应将 -I 标志的值设置为包含您要包含的 header(s) 的文件夹。

我的问题是 /usr/include 中有一个 gmock 和一个旧版本的 gtest 文件夹,没有 MOCK_METHOD 但 MOCK_METHOD0, ... 1等等。那是 Clang 会给出错误的版本,但是我的 Bazel WORKSPACE 文件从 Github 存储库中提取了 gtest,所以这就是它编译正确的原因。