我正在使用 cmocka 对用 C 编写的大型代码库进行单元测试。我希望单元测试在库级别运行,但是在共享库中编译时遇到了模拟函数的问题。我相信共享库是问题所在,因为--wrap
当不是共享库的一部分时,我可以使用链接器标志成功地模拟相同的代码。同样SOURCE_FILE
,这是我的两种不同的编译方法。作为参考,我正在尝试模拟 C 标准库函数strcmp
。
导致成功模拟的编译步骤strcmp
:
gcc -std=c99 -c SOURCE_FILE.c -o OBJECT_FILE.o
gcc -Wl,-rpath=cmocka/build/src,--wrap=strcmp -Icmocka/include TEST_FILE.c -Lcmocka/build/src -lcmocka OBJECT_FILE.o -o my_test
./my_test
创建共享库然后进行测试的编译步骤。执行my_test
演示不成功的模拟时抛出错误strcmp
:
gcc -std=c99 -fpic -c SOURCE_FILE.c -o OBJECT_FILE.o
gcc -shared OBJECT_FILE.o -o lMY_LIBRARY.so
gcc -Wl,-rpath=cmocka/build/src,-rpath={path to current dir},--wrap=strcmp -Icmocka/include TEST_FILE.c -L/home/{path to current dir} -Lcmocka/build/src -lMY_LIBRARY -lcmocka -o my_test
./my_test
供参考,这是我看到的错误:
[ ERROR ] --- __wrap_strcmp() has remaining non-returned values.
TEST_FILE.c:28: note: remaining item was declared here
__wrap_strcmp.x parameter still has values that haven't been checked.
每当您尝试使用 cmocka 时,都会引发此 cmocka 错误will_return
,但未发生函数包装。我试图弄清楚为什么创建共享对象的一小步会阻止 gcc 链接器包装函数调用。
我找不到有关堆栈溢出或其他有关在共享对象上使用 cmocka 的任何信息。将不胜感激任何想法,建议或解释为什么这不起作用。我知道--wrap
当调用者和被调用者定义在同一个文件中时,这不起作用。这就是这里造成问题的原因吗?