链接目标文件和静态库时出现多重定义错误

时间:2016-04-14 04:51:25

标签: c++ g++ googletest

我需要在静态库libddrmgr.a中模拟一些函数来编写单元测试。我在gtest_ddrmaint_cmds.cpp上实现了模拟代码并将其编译为gtest_ddrmaint_cmds.o。 但是,在链接目标文件和静态库时,g ++会提示多个定义错误:

g++ -g -o ddrmainttest main.o gtest_ddrmaint_cmds.o /walker/external/3rdparty/google/gtest.a /walker/external/3rdparty/google/gmock.a /walker/src/build/SLES/lib/libddrmgr.a -lacl -lxml2 -lpthread -ldl -luuid -lz -lresolv -lcap -lrt --coverage

/walker/src/build/SLES/lib/libddrmgr.a(ddrmgr.o): In function `DDR_Shutdown':
/walker/src/ddrmgr/ddrmgr.cpp:110: multiple definition of `DDR_Shutdown'
gtest_ddrmaint_cmds.o:/walker/src/gunittest/ddrmaint/gtest_ddrmaint_cmds.cpp:16: first defined here
/walker/src/build/SLES/lib/libddrmgr.a(ddrmgr.o): In function `DDR_Init':
/walker/src/ddrmgr/ddrmgr.cpp:38: multiple definition of `DDR_Init'
gtest_ddrmaint_cmds.o:/walker/external/3rdparty/google/gmock-1.7.0/gtest/include/gtest/internal/gtest-internal.h:443: first defined here
collect2: ld returned 1 exit status
make: *** [ddrmainttest] Error 1

我还编写了一个演示程序来测试是否可以覆盖目标文件中的某些库拥有的函数,并且它可以正常工作。有人可以告诉我为什么它会在上面提示错误吗?谢谢!

1 个答案:

答案 0 :(得分:1)

为了在C ++中模拟函数,你不能简单地重新定义它们。正如您所经历的那样,这会导致multiple definition链接器错误。

正如理查德·霍奇斯(Richard Hodges)在他的评论中所建议的那样,继续前进的方法是为你想要使用的库函数编写一个瘦包装器,并为这些包装器对象创建模拟。

谷歌模拟docs中有很好的解释:

  

可以使用Google Mock来模拟免费功能(即a   C风格的功能或静态方法)。你只需要改写你的   代码使用接口(抽象类)。

     

不要直接调用自由函数(比如OpenFile),而是介绍   它的接口,并有一个调用free的具体子类   功能:

class FileInterface
{
public:
  ...
  virtual bool Open(const char* path, const char* mode) = 0;
};
class File : public FileInterface
{
public:
  ...
  virtual bool Open(const char* path, const char* mode)
  {
    return OpenFile(path, mode);
  }
};
     

您的代码应与FileInterface通信以打开文件。现在很容易模拟出这个功能。