链接对象文件和静态库时出现多定义错误
multiple definition error while linking object file and static library
为了编写单元测试,我需要模拟静态库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对话以打开文件。现在很容易模拟出这个函数。
相关文章:
- 使用命名空间时出现多个定义错误
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- 尝试调用 .h 文件中定义的变量时出现变量未定义错误
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 链接阶段出现多重定义错误
- 避免模板类中的重定义错误
- 即使我没有包含多个文件,C++中的多个定义错误
- 跨多个类的全局变量而不会出现重定义错误?
- 尝试运行 wasm 函数时出现模块未定义错误
- C++ 预期的左大括号以及重定义错误
- C++:成员的越界声明必须是纯虚函数的定义错误
- c++中数组的未定义错误
- Visual C:模板类中的自定义错误消息
- 为什么C++模板不会导致多个定义错误?
- 只有一个定义/声明时标头声明变量的多堆定义错误
- C++ 在多个其他类中使用单个类 - 编译时出现多个定义错误
- 基类未定义.错误 C2504
- Q 斯坦达项重定义错误
- 可视化C++中的结构定义错误
- VC++ C2011 重定义错误 - 未使用的头文件