我有一个共享库,需要为此编写测试。假设该库中有一个名为func()的函数:
// from the library
<some_type> func(<some_params>); // signature of the function func
库的文档指出,必须在某些条件下调用此函数。因此,为了测试该要求,我在测试文件中编写了具有相同签名的我自己的函数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 ++。
我目前正在使用共享库。但是我实际上对共享库和静态库都感兴趣。
答案 0 :(得分:2)
好吧,您可以在Linux上使用LD_LIBRARY_PRELOAD技巧。
将您自己的func()
实现编译到共享库中。
gcc -shared -fPIC func.c -o func.so
然后在shell提示符下
> LD_LIBRARY_PRELOAD=func.so ./main
,您的func()版本将被调用。
如果要链接呼叫-首先用func()装饰原始func(),然后代码应如下所示
typedef a (*original_func_type)(B b);
a func(B b) {
... // whatever code you want
original_func_type orig_func;
orig_func = (original_func_type)dlsym(RTLD_NEXT, "func");
return orig_func(b);
}
这就是你想要的吗?
更新