【问题标题】:googletest can't link to DUTgoogletest 无法链接到 DUT
【发布时间】:2021-10-27 04:23:02
【问题描述】:

当我尝试将要测试的代码链接到我的测试时,我得到undefined refrence。 当我在同一个源文件中使用相同的函数时没有问题。 这里是链接器错误

g++  -o "VW_Test"  ./tests/scaleSignalTests.o  ./src/gtest-death-test.o ./src/gtest-filepath.o ./src/gtest-matchers.o ./src/gtest-port.o ./src/gtest-printers.o ./src/gtest-test-part.o ./src/gtest-typed-test.o ./src/gtest.o ./src/gtest_main.o  ./VirtualWall/PointCalc.o ./VirtualWall/checks.o ./VirtualWall/mathHelper.o   
./tests/scaleSignalTests.o: In function `TestBody':
C:\projects\VIRTUAL_WALL_TEST\Default/../tests/scaleSignalTests.cc:16: undefined reference to `multiplyInteger(int, int, int*)'
collect2.exe: error: ld returned 1 exit status
make: *** [VW_Test] Error 1
"make -j4 all" terminated with exit code 2. Build might be incomplete.

这是测试文件

#include "PointCalc.h"
#include "gtest/gtest.h"
#include <math.h>


namespace {
class scaledIntTest : public ::testing::Test {
};
TEST_F(scaledIntTest, Multiplication)
{
  EXPECT_EQ(INT_FACTOR_TO_METER, 1000);
  int result = 0;

  // EXPECT_EQ(referencePoint, resultPoint);

  EXPECT_EQ(RTN_NO_ERR,
            multiplyInteger(INT_FACTOR_TO_METER * 1,
                            INT_FACTOR_TO_METER * 1,
                            &result));
  EXPECT_EQ(INT_FACTOR_TO_METER, result);
}


int foo(void)
{
  int result = 0;
  multiplyInteger(INT_FACTOR_TO_METER * 1, INT_FACTOR_TO_METER * 1, &result);
  return 1;
}
} 

PointCalc.h

#ifndef POINT_CALC_H
#define POINT_CALC_H

#include "checks.h"
#define INT_FACTOR_TO_METER 1000

enum Return_codes {
  RTN_NO_ERR = 0,
  RTN_UNKNOWN,
  RTN_OUTPUT_ERR,
  RTN_MEMORY_ERR,
  RTN_INPUT_ERR,
  RTN_RANGE_ERR,
  RTN_VALIDATION_ERR
};

typedef struct sPoint {
  int x;
  int y;
  int z;
} sPoint;

int multiplyInteger(int a, int b, int *result);
int addPoints(sPoint const *a, sPoint const *b, sPoint *sum);
int subPoints(sPoint *minuend, sPoint *subtrahend, sPoint *diff);
int mulPoints(int factor, sPoint *Point, sPoint *product);

#endif

PointCalc.c

#include "PointCalc.h"
#include "checks.h"
#include "mathHelper.h"
#include <stdlib.h>

int multiplyInteger(int a, int b, int *result)
{

  if (!result) return RTN_OUTPUT_ERR;

  const long product = (long)a * b / INT_FACTOR_TO_METER;
  if (abs(product) < 32000) {
    *result = (int)product;
    return RTN_NO_ERR;
  }
  else {
    *result = sign(product) * 32000;
  }
  return RTN_RANGE_ERR;
}

我不知道这里出了什么问题。有关如何解决此问题的任何建议?

【问题讨论】:

  • 我们可以看看 PointCalc.cpp 吗?
  • @S.M.添加了,但由于它有其他依赖项并且编译时没有错误和警告,并且该函数在其他上下文中工作,我想为了简洁起见我会省略它。我还将其缩短为相关功能。
  • 为了您未来的成功。你以为不重要的,其实很重要。这就是为什么在 SO 上非常需要 minimal reproducible examples。

标签: c++ c linker googletest


【解决方案1】:

您在 C 文件中定义函数,该文件具有默认的 extern "C" 命名约定。 .h 中的函数必须是

extern "C" int multiplyInteger(int, int, int*);

或者整个头文件的声明必须包含在

#ifdef __cpluplus
extern "C" {
#endif
...

#ifdef __cpluplus
}
#endif

【讨论】:

  • 好的,我试试。你能告诉我为什么foo 有效吗?
  • 它不起作用,显示第一个错误。或者你在另一个 .c 文件中有 foo,而不是在 .cc 文件中。
  • 在我的测试过程中,我注释掉了 googletest 并只编译了 foo(虽然它没有被调用,所以链接器可能会丢弃它)。还报告了多次调用它。无论如何它现在工作。非常感谢。
  • 是的,未使用的函数未链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多