gpt4 book ai didi

c - 为单个测试可执行文件的范围替换通用 .o 文件中的 C 函数

转载 作者:太空宇宙 更新时间:2023-11-04 04:07:48 25 4
gpt4 key购买 nike

所以,我有一个库调用 init_foo() 和一个调用它的函数 bar()。这些都存在于 library.o 中,还有其他一些双方都需要的有用的东西。

我想写一些代码,bar_init_failure.t.c,来测试当 init_foo() 失败时会发生什么,而不是实际设置失败。在 Perl 中,我们的大部分代码库,我将启动 Test::Resub并用返回失败代码的 stub 替换库调用。为了在 C 中完成类似的事情,我模糊地认为我可以在 bar_init_failure.t.c 的源代码中重新定义 init_foo 并且仍然链接到 library.o 用于其余代码,但是 gccld 提示重复符号(而不是选择第一个)所以我想我一定是错的(而且我对这类事情很生疏,所以我对自己的策略并不过分自信)。

这里有什么方法可以安抚链接器,还是我应该使用另一种策略? (如果可以的话,我宁愿不必破解 library.c 代码。)

最佳答案

如果您可以将 library.c 重新编译成共享库,那么您可以在单元测试中重新定义 init_foo()。 ld 不会提示重复的符号,无论是在编译时还是在执行时,都会调用可执行文件中的函数,无论动态库包含什么 - 至少在类 Unix 系统上 - 我从未在 Windows 上尝试过。

这可能会阻止您测试 bar(),因为您将无法在其他测试中调用真正的 init_foo();除非你使用 dlsym()从你自己的 init_foo() 调用它,例如当一个全局变量被设置时。

关于c - 为单个测试可执行文件的范围替换通用 .o 文件中的 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3806240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com