我正在使用YCM为我的Vim设置提供错误检查。在我使用MOCK_METHOD时,它抛出错误说“C++要求所有声明都有类型说明符”,但Bazel构建得很好。我想我缺少了某种标志?
这家伙有着同样的问题却没有回给予一个答案:
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++要求所有声明都有类型说明符”,这告诉我它不能识别宏。
下面是我的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,但没有成功。我做错了什么?
2条答案
按热度按时间aydmsdu91#
-I
标志指定包含的文件应位于何处。您应该将
-I
标志的值设置为包含要包含的头文件的文件夹,而不是列出已编译库的路径。tjvv9vkg2#
我的问题是,在/usr/include中有一个gmock和一个gtest文件夹,这是一个旧版本,没有MOCK_METHOD,但有MOCK_METHOD0,... 1等。这是Clang会给予错误的版本,但我的Bazel WORKSPACE文件从Github存储库中提取了gtest,所以这就是为什么它编译正确的原因。