Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用gtest的未定义引用_C++_Googletest - Fatal编程技术网

C++ 使用gtest的未定义引用

C++ 使用gtest的未定义引用,c++,googletest,C++,Googletest,为什么下面的ASSERT_EQ会导致对Bar::kBar的引用未定义错误 编译:g++a.cc-lgtest-lpthread #include <gtest/gtest.h> class Bar { public: static const size_t kBar = 0; }; TEST(Basic, Basic) { ASSERT_EQ(0, Bar::kBar); } int main(int argc, char **argv) { testing::I

为什么下面的
ASSERT_EQ
会导致对Bar::kBar的
引用未定义错误

编译:
g++a.cc-lgtest-lpthread

#include <gtest/gtest.h>

class Bar {
 public:
  static const size_t kBar = 0;
};

TEST(Basic, Basic) {
  ASSERT_EQ(0, Bar::kBar);
}

int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
#包括
分类栏{
公众:
静态常量大小\u t kBar=0;
};
测试(基本,基本){
断言式(0,Bar::kBar);
}
int main(int argc,字符**argv){
测试:InitGoogleTest(&argc,argv);
返回运行所有测试();
}

来自谷歌测试常见问题解答:

如果您的类具有静态数据成员:

您还需要在foo.cc中的类主体之外定义它:

< >否则,代码无效,C++可能会以意外方式中断。 特别是,在Google测试比较断言中使用它(EXPECT_EQ等) 将生成“未定义引用”链接器错误

这个解释相当神秘。(为什么它是无效的C++?) 可能是因为一个令人满意的解释是相当技术性的

即使您的类
bar
使用 初始值设定项,不足以向数据成员提供 具有外部链接(即链接器可以看到)的定义,以及 如果没有一个代码,任何试图odr-use1
Bar::kBar
的代码都将 遇到未定义的引用链接错误。这是可以说明的 不涉及谷歌测试:

foobar.cpp

#include <cstdlib>

class Bar {
    public:
    static const std::size_t kBar = 0;
};

bool foo(std::size_t const & k)
{
    return k == 0;
}

int main()
{
    return foo(Bar::kBar);
}
解决方案符合常见问题解答:

#include <gtest/gtest.h>

class Bar {
    public:
    static const size_t kBar = 0;
};

const size_t Bar::kBar;

TEST(Basic, Basic) {
  ASSERT_EQ(0, Bar::kBar);
}

int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}
#包括
分类栏{
公众:
静态常量大小\u t kBar=0;
};
常量大小\u t Bar::kBar;
测试(基本,基本){
断言式(0,Bar::kBar);
}
int main(int argc,字符**argv){
测试:InitGoogleTest(&argc,argv);
返回运行所有测试();
}
从C++17开始,如果 在初始化的类内声明前面加上
inline
(其中 将使其成为一个定义)


[1]

非正式地说,如果对象的地址被获取,或者引用被删除,那么就使用odr 绑定到它,并且如果对其进行函数调用或其 地址已记下。如果使用odr对象或函数,则其定义必须 存在于程序的某个地方;违反这一点就是链路时间错误


从我的回答中可以看出,你的问题是关于C++的,只是附带地提到GoGoestTest.考虑添加语言标记。@ MikeKinghan谢谢你的回答!如何将类的静态成员设置为内联。这是关于“从C++17开始,如果在初始化的类内声明前面加上inline(这将使其成为一个定义),则可以省略类外定义。”。编译器为我抛出一个错误。我使用的是GCC4.9.2版本。我认为4.92GCC不包括C++ 17的使静态变量内联以赋予变量外部链接的特性。
#include <cstdlib>

class Bar {
    public:
    static const std::size_t kBar = 0;
};

bool foo(std::size_t const & k)
{
    return k == 0;
}

int main()
{
    return foo(Bar::kBar);
}
$ g++ foobar.cpp
/tmp/ccWaEsDu.o: In function `main':
foobar.cpp:(.text+0x1c): undefined reference to `Bar::kBar'
collect2: error: ld returned 1 exit status
#include <gtest/gtest.h>

class Bar {
    public:
    static const size_t kBar = 0;
};

const size_t Bar::kBar;

TEST(Basic, Basic) {
  ASSERT_EQ(0, Bar::kBar);
}

int main(int argc, char **argv) {
  testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}