C 如果其他库中存在相同的函数,如何要求库使用其内部函数

C 如果其他库中存在相同的函数,如何要求库使用其内部函数,c,linker,C,Linker,我有一个C程序,使用两个库libA和libB。问题是,;这两个库都有list_delete函数,这是一个编译器错误。通过编写这些行,我能够成功地编译和链接我的代码 #undef list_delete #define list_delete mysql_list_delete 在此之后,我可以在代码中调用libA的list_delete函数。但是当我调用libB的任何函数(除了list_delete)时,它内部调用了list_delete函数,这恰好是libA的list_delete函数 为什

我有一个
C
程序,使用两个
libA和libB。问题是,;这两个库都有list_delete函数,这是一个编译器错误。通过编写这些行,我能够成功地编译和链接我的代码

#undef list_delete
#define list_delete mysql_list_delete
在此之后,我可以在代码中调用libA的list_delete函数。但是当我调用libB的任何函数(除了list_delete)时,它内部调用了list_delete函数,这恰好是libA的list_delete函数

为什么??libB应该在内部调用list_delete函数,而不是libA的list_函数


问题是我如何告诉libB库使用它自己的list\u delete函数(请记住,我的程序正在使用libA的list\u delete函数)

如果两个库都以静态方式链接,就会发生这种情况。链接器在两个obj文件中都看到一个
list\u delete
符号,并且必须选择最后一个可执行文件中的符号

要避免这种情况,您需要:

  • 重新编写并重新编译一个或两个库,以便为各自的
    list\u delete()
    函数使用不同的名称

  • 将应用程序更改为动态链接到库,而不是静态链接,这样它们就看不到彼此的函数,也就不再冲突


  • 使用dlopen和RTLD_DEEPBIND加载库解决了这个问题

    dlopen(“libB”,RTLD_LAZY | RTLD_DEEPBIND)

    RTLD_DEEPBIND(自glibc 2.3.4起)
    
    将此库中符号的查找范围置于全局范围之前。这意味着自包含库将优先使用其自己的符号,而不是已加载库中包含的具有相同名称的全局符号。POSIX.1-2001中未指定此标志。

    我不是这两个库的所有者,因此无法更改函数名。我将我的代码静态链接到libA,动态链接到libB。如果libB是动态链接的,则它是一个外部模块,因此不能调用静态链接到应用程序中的libA函数,除非libB本身在内部使用libA,在这种情况下,它将使用自己的libA副本,不是你的应用程序使用的副本。这是我的理解,但libB正在调用libA函数。事实上,它只发生在Linux(Ubuntu,gcc)上。相同的代码在OSXSorry上运行良好。两个库都是动态链接的。您的库是静态的还是动态的(.dll、.so、.dylib)?一种方法是将libB的
    list\u delete
    声明为
    static
    。这将要求使用它的函数位于同一编译单元中,因为它的符号没有导出。我无法控制库,因为它们是第三方库