【发布时间】:2019-05-06 13:12:12
【问题描述】:
我有一个需要为其编写测试的共享库。假设库中有一个名为 func() 的函数:
// from the library
<some_type> func(<some_params>); // signature of the function func
Library 的文档指出,必须在特定条件下调用此函数。因此,为了测试该要求,我在测试文件中编写了自己的具有相同签名的函数 func():
// test.cpp
bool is_func_called = false;
<some_type> func(<some_params>) {
is_func_called = true;
}
这种方法正确吗?我的 func() 实现是否保证覆盖库中的实现?
有时需要能够从库中装饰 func()(而不是覆盖它):
// test.cpp
bool is_func_called = false;
<some_type> func(<some_params>) {
is_func_called = true;
func(); // a call to the implementation in the library
}
如果我重写了库中的实现,如何访问它?
环境:Ubuntu,g++。
我目前正在使用共享库。但我实际上对(共享库和静态库)都感兴趣。
【问题讨论】:
-
如果你定义了完全相同的签名,那么链接器会报错。
-
不,它没有。它以某种方式选择了我的实现
-
您不能对函数进行双重定义。如果出于测试目的,您只链接到您自己的实现,而不是库,这应该没问题。但我建议使用依赖注入和一些不错的测试库(例如 GoogleMock )而不是自己实现此功能。
-
静态库还是动态库?对于动态库,您可以使用the
LD_PRELOADtrick。 -
@Someprogrammerdude 我目前正在使用共享库。但我实际上对两者都感兴趣。
标签: c++ linux overriding shared-libraries decorator