我正在尝试了解
fff
框架和 C++ 的单一定义规则。
我使用
fff
来模拟自由函数并测试它们,我将使用以下示例来解释问题。
要嘲笑的库是
libarchive
,我嘲笑archive_write_free
。
我有以下一组文件:
LibArchiveFake.h
-> 它包含声明 DECLARE_FAKE_VALUE_FUNC
LibArchiveFake.cpp
-> 它包含定义 DEFINE_FAKE_VALUE_FUNC
并编译为目标文件。TarballArchiverTest.cpp
-> 其中包括头文件并包含实际测试,并且还编译为目标文件。tar_test
这只是二进制文件。二进制文件使用前面提到的目标文件进行编译,并链接到
libarchive.so
,如下所示。
g++ -Wall -Wextra -Werror -Wpedantic -g -ggdb -O0 -DNC_DEBUG CMakeFiles/utilitiesTests.dir/mainTest.cpp.o CMakeFiles/utilitiesTests.dir/FStreamFilesystemOpsTest.cpp.o CMakeFiles/utilitiesTests.dir/CopierTest.cpp.o CMakeFiles/utilitiesTests.dir/FakeLibArchive.cpp.o CMakeFiles/utilitiesTests.dir/TarballArchiverTest.cpp.o -o utilitiesTests -lgmock /usr/lib64/libgtest.so /usr/local/lib/libboost_filesystem.so.1.74.0 /usr/local/lib/libboost_iostreams.so.1.74.0 /usr/lib64/libarchive.so /usr/lib64/libgtest.so -lpthread
我通过readelf检查了生成的
LibArchiveFake.cpp
目标文件及其.ii
文件。它包含 archive_write_free
的强大定义,/usr/lib64/libarchive.so
也是如此。
LibArchiveFake.o
:55: 000000000000275f 752 FUNC GLOBAL DEFAULT 1 archive_write_free
/usr/lib64/libarchive.so.o
:572: 0000000000063740 9 FUNC GLOBAL DEFAULT 12 archive_write_free
我知道 ODR 有一些例外,但我不明白
fff
如何不违反 ODR。
我将不胜感激任何线索。
它违反了 ODR,并且 C++ 标准未指定使用此实用程序的程序的行为。
在这种情况下,链接器如何处理从 so 文件加载符号的细节恰好使结果不会完全是灾难性的。