无法识别 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,所以这就是它编译正确的原因。
我正在使用 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,所以这就是它编译正确的原因。