链接对象文件和静态库时出现多定义错误

multiple definition error while linking object file and static library

本文关键字:定义 错误 对象 文件 静态 链接      更新时间:2023-10-16

为了编写单元测试,我需要模拟静态库libddrmgr.a中的一些函数。我在gtest_ddrmaint_cmds.cpp上实现了mock代码,并将其编译为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

我还编写了一个演示程序来测试在对象文件中覆盖一些库拥有的函数是否可以,并且它运行良好。有人能告诉我为什么上面会提示错误吗?谢谢

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

正如Richard Hodges在评论中所建议的那样,为您想要使用的库函数编写一个瘦包装器,并为这些包装器对象创建mock。

它在谷歌模拟文档中得到了很好的解释:

可以使用Google Mock来模拟免费功能(即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对话以打开文件。现在很容易模拟出这个函数。