Gcc 如何链接两个冲突共享库?

Gcc 如何链接两个冲突共享库?,gcc,linker,solaris,Gcc,Linker,Solaris,我的项目正在使用ACE库,需要链接另一个库libsdk。因此,它正在使用另一个版本的ACE库 链接顺序如下:…-lMyAce-lsdk-lAnotherAce 当应用程序运行时,在MyAce中调用libsdk.so方法(我检查了核心转储),应用程序崩溃 如果我将链接顺序更改为:…-lsdk-lAnotherAce-lMyAce 我的代码在另一个空间中调用了方法,它也是崩溃的 如果我只链接我的王牌,那就是崩溃。如果只链接另一个空间,则会出现一些链接错误 让libsdk.so调用它的ACE库,我的代

我的项目正在使用ACE库,需要链接另一个库libsdk。因此,它正在使用另一个版本的ACE库

链接顺序如下:…-lMyAce-lsdk-lAnotherAce

当应用程序运行时,在MyAce中调用libsdk.so方法(我检查了核心转储),应用程序崩溃

如果我将链接顺序更改为:…-lsdk-lAnotherAce-lMyAce

我的代码在另一个空间中调用了方法,它也是崩溃的

如果我只链接我的王牌,那就是崩溃。如果只链接另一个空间,则会出现一些链接错误

让libsdk.so调用它的ACE库,我的代码调用我的ACE库。
如何解决此问题?

Solaris链接器提供了一个可能会有所帮助的选项,尽管它确实重新设计了应用程序,使同一程序中不需要两组名称相同的库 这将是最好的解决方案


在每个库或程序中记录它在哪个库中找到了符号,因此如果libsdk.so是使用-B direct-lAnotherAce构建的,它将记录它的每个引用到另一个库,而不是MyAce。然后将代码链接到-B direct-lsdk-lMyAce(不包括-lAnotherAce,因为libsdk依赖项会解决这个问题),代码会记录它对MyAce的调用。

Solaris链接器有一个选项可能会有所帮助,虽然确实重新设计了应用程序,使其不需要在同一程序中使用两组名称相同的库 这将是最好的解决方案


在每个库或程序中记录它在哪个库中找到了符号,因此如果libsdk.so是使用-B direct-lAnotherAce构建的,它将记录它的每个引用到另一个库,而不是MyAce。然后将代码链接到-B direct-lsdk-lMyAce(不包括-lAnotherAce,因为libsdk依赖项会处理这个问题),代码会记录它对MyAce的调用。

链接顺序在这里没有帮助。如果两个库定义了相同的符号,则较早的定义将始终获胜。你可以决定哪一个胜出,但你不能两者兼得。你能控制图书馆吗?也就是说,你能修改它们吗?@ams看起来链接顺序决定了加载顺序。第一次加载成功。链接顺序在这里没有帮助。如果两个库定义了相同的符号,则较早的定义将始终获胜。你可以决定哪一个胜出,但你不能两者兼得。你能控制图书馆吗?也就是说,你能修改它们吗?@ams看起来链接顺序决定了加载顺序。第一次装货获胜。