使用GNU链接器包装C ++函数

时间:2011-12-06 15:35:18

标签: c++ linker mocking

我喜欢GNU链接器功能来包装很多函数。我通常用它来模拟,例如非确定性函数调用如rand()。考虑以下示例,我想为giveMeANumber编写单元测试:

//number.cpp
int giveMeANumber() {
  return rand() % 6 + 1;
}

我可以使用GNU链接器功能包装来调用rand,如下所示:

//test.cpp
extern "C" int __wrap_rand(void) {
return 4;
}

void unitTest() {
  assert giveMeANumber() == 5;
}

$ g++ test.cpp -o test number.o -Xlinker --wrap=rand

有没有办法对普通的C ++函数做同样的事情?以下不起作用,我猜是因为名称错误。但即使我用错误的名字尝试它也不起作用。

//number.cpp
int foo() {
  //some complex calculations I would like to mock
}
int giveMeANumber() {
  return foo() % 6 + 1;
}

//test.cpp
extern "C" int __wrap_foo(void) {
return 4;
}

$ g++ test.cpp -o test number.o -Xlinker --wrap=foo

2 个答案:

答案 0 :(得分:9)

您还需要extern "C"要包装的函数(如果可能)或者您需要包含错位​​的名称,例如__wrap__Z3foov然后将--wrap=_Z3foov传递给接头

获得正确的下划线有点棘手。这对我有用:

$ cat x.cc
#include <iostream>
using namespace std;

int giveMeANumber();

int main() {
    cerr << giveMeANumber() << endl;
    return 0;
}

$ cat y.cc
int giveMeANumber() {
    return 0;
}

extern "C" int __wrap__Z13giveMeANumberv() {
    return 10;
}

$ g++ -c x.cc y.cc && g++ x.o y.o -Wl,--wrap=_Z13giveMeANumberv && ./a.out
10

答案 1 :(得分:1)

您似乎正在尝试模拟函数和类以进行测试。您是否考虑过使用 Google Mock