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-use1Bar::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();
}