相关疑难解决方法(0)

覆盖C中的函数调用

我想为了记录调用而覆盖对各种API的某些函数调用,但我也可能希望在将数据发送到实际函数之前对其进行操作.

例如,假设我getObjectName在源代码中使用了一个名为数千次的函数.我想暂时覆盖此函数,因为我想更改此函数的行为以查看不同的结果.

我创建了一个像这样的新源文件:

#include <apiheader.h>    

const char *getObjectName (object *anObject)
{
    if (anObject == NULL)
        return "(null)";
    else
        return "name should be here";
}
Run Code Online (Sandbox Code Playgroud)

我像往常一样编译所有其他源代码,但是在链接API的库之前我首先将它链接到此函数.这工作正常,但我显然不能在我的重写函数中调用真正的函数.

是否有一种更简单的方法来"覆盖"一个函数而不会链接/编译错误/警告?理想情况下,我希望能够通过编译和链接一个或多个额外的文件来覆盖该函数,而不是通过链接选项或改变我的程序的实际源代码.

c linker overriding function

68
推荐指数
7
解决办法
9万
查看次数

将两个共享库与一些相同的符号链接在一起

我链接两个不同的共享库.两个库都定义了一些共享名称但具有不同实现的符号.我不能让每个库使用自己的实现而不是另一个.

例如,两个库都定义了一个bar()内部调用的全局函数.库1调用它foo1(),库2调用它foo2().

Lib1.so:

T bar
T foo1()     // calls bar()
Run Code Online (Sandbox Code Playgroud)

Lib2.so:

T bar
T foo2()     // calls bar()
Run Code Online (Sandbox Code Playgroud)

如果我将我的应用程序链接到Lib1.so然后链接到Lib2.so即使在调用时也会调用Lib1.so中的bar实现foo2().另一方面,如果我将我的应用程序链接到Lib2.so然后链接到Lib1.so,则始终从Lib2.so调用bar.

有没有办法让库总是更喜欢自己的实现高于任何其他库?

c unix gcc shared-libraries dynamic-linking

44
推荐指数
2
解决办法
2万
查看次数

覆盖静态库中定义的C函数

我有一个C文件的静态库,在Cygwin上用g ++编译.我希望单元测试库中定义的一个函数.该函数调用该库中定义的另一个函数,我希望覆盖依赖项以将其替换为我自己的该函数版本.我无法修改静态库中的内容,因此此解决方案[ 覆盖C中的函数调用 ]不适用.

通常,我可以编写.cpp文件并包含.c文件,其中包含我想要单元测试的函数,它实际上使用我添加的代码扩展了该文件.这是一个我从未用于生产代码的肮脏技巧,但它对于单元测试C文件很方便,因为它使我的测试代码能够访问该C文件中的静态内容.然后,我可以写我的假依赖版本,以及调用我正在测试的函数的单元测试函数.我编译my.cpp来获取my.o,然后将其与静态库链接.从理论上讲,由于链接器已经找到了依赖关系的定义(我提供的那个),因此它不会在库中查找,也不会发生冲突.通常这可行,但现在我得到一个"多重定义"错误,链接器首先找到我的假,然后找到真正的假.我不知道是什么原因引起的,不知道该找什么.我也不能把它归结为一个简单的例子,因为我的简单例子没有这个问题.

想法好吗?

c gcc cygwin g++

7
推荐指数
1
解决办法
7587
查看次数

标签 统计

c ×3

gcc ×2

cygwin ×1

dynamic-linking ×1

function ×1

g++ ×1

linker ×1

overriding ×1

shared-libraries ×1

unix ×1