我有一个使用两个C
libA和libB的libraries
程序。问题是;这两个库都有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_function。
问题是如何告诉libB库使用自己的list_delete函数(请记住我的程序正在使用libA的list_delete函数)
答案 0 :(得分:0)
如果两个库都静态链接,就会发生这种情况。链接器在两个obj文件中都看到list_delete
符号,并且必须选择最终可执行文件中的哪一个。
为避免这种情况,您需要:
重新编写并重新编译一个或两个库,以便为各自的list_delete()
函数使用不同的名称。
将您的应用更改为动态链接到库而不是静态,然后他们无法看到彼此的功能,也不会再发生冲突。
答案 1 :(得分:0)
使用dlopen和RTLD_DEEPBIND加载库解决了这个问题。
dlopen(" libB",RTLD_LAZY | RTLD_DEEPBIND);
RTLD_DEEPBIND (since glibc 2.3.4)
Place the lookup scope of the symbols in this library ahead of the global scope. This means that a self-contained library will use its own symbols in preference to global symbols with the same name contained in libraries that have already been loaded. This flag is not specified in POSIX.1-2001.