【问题标题】:Undefined Symbol when method declared in cpp body [closed]在cpp主体中声明方法时未定义的符号[关闭]
【发布时间】:2017-05-08 14:34:39
【问题描述】:

我有一个简单的 C++ 类,其中包含我想从 Google 测试 Fixture 调用的方法。

当我在 cpp 文件中声明该方法时,编译器会抛出 undefined symbol 错误:

Class.h

class Class {
 public:
  double test() {
    return 1.;
  }
}

Class.cpp

double Class::test() {
    return 1.;
}

GoogleTest.cpp

#include "Class.h"    

class GoogleTest : public ::testing:Test {
 protected:
  Class c;
}

TEST_F(GoogleTest, TestIt) {
  EXPECT_EQ(c.test(), 1.);
}

同时在头文件中定义方法,我可以像魅力一样编译:

Class.h

class Class {
 public:
  double test() {
    return 1.;
  }
}

GoogleTest.cpp

#include "Class.h"

class GoogleTest : public ::testing:Test {
 protected:
  Class c;
}

TEST_F(GoogleTest, TestIt) {
  EXPECT_EQ(c.test(), 1.);
}

这种行为的原因是什么?我不想在 header 中定义我所有的方法。


整个错误:

Undefined symbols for architecture x86_64:
  "Numeric::test()", referenced from:
      ConstantsTest_Gamma_Test::TestBody() in Test.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [runUnitTests] Error 1

【问题讨论】:

  • 首先,我认为Class.h中第一种情况下test()的定义实际上应该是一个声明。其次,错误应该是编译测试时没有编译Class.cpp。检查你的制作文件。我没有使用过 Google Test,所以我无法给出问题的解决方案。
  • 为什么要定义同一个函数两次?
  • 发布确切的错误信息
  • 在创建测试二进制文件时是否忘记链接Class.o(或Class.cpp 编译到的任何目标文件或库)?

标签: c++ testing compiler-errors


【解决方案1】:

链接测试程序时,您省略了链接Class.o(或任何目标文件或库Class.cpp 编译到)。可能,如果它在库中,则在依赖它的代码之前指定它。

推理基于以下几行:

  "Numeric::test()", referenced from:
      ConstantsTest_Gamma_Test::TestBody() in Test.cpp.o

测试本身 (Test.cpp.o) 已链接。 ConstantsTest_Gamma_Test::TestBody 是由 TEST_F() 宏生成的名称。缺少的是Numeric::test(),它在被测类中。

您需要将测试中的类添加到您的链接行(相对于其他库以正确的顺序)。你如何做到这一点很大程度上取决于你使用的是什么构建系统,所以我无法更详细地回答这个问题。

【讨论】:

    【解决方案2】:

    很可能您的编译设置不正确,Class.cpp 不被视为值得在您的 IDE 中编译的文件。因此,它没有链接到生成的可执行文件中,这会导致“未定义的符号”。在您提供更多详细信息之前无法确定:确切的错误消息、您使用的 IDE 等等。

    【讨论】:

    • 好的,我重新检查了所有链接,结果发现我的 cmake 文件中没有 add_executable(Class.cpp)。问题是,我编译了两个可执行文件(一个用于测试,一个用于程序)并且忘记包含 cpp 文件。一些完全在头文件中定义的类继续工作,所以我没有重新检查我的可执行链接。总而言之,我的错......
    猜你喜欢
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2012-04-09
    • 2013-04-13
    相关资源
    最近更新 更多