如何解决符号混淆?

How to resolve confilct of symbols?

本文关键字:符号 解决 何解决      更新时间:2023-10-16

我有一个库libA.so,其中有类MyClass,我有一个库libB.so,其中也有名为MyClass的类。这些类仅用于库中。首先,我的程序加载libA.so然后libB.so.

问题是libB.so使用来自libA.soMyClass,但必须使用自己的MyClass

如何在不重命名或使用命名空间的情况下解决问题?

G++ 版本是 5.4.0

通过动态链接,可以使用链接器版本脚本来限制从库中导出哪些符号。 如果确保所有冲突符号都是本地的(或隐藏的,因为它们有时被称为(,则冲突会消失,因为这些符号严格位于库内部。

无论如何,以这种方式管理符号可见性是一种很好的做法,它也可以减少程序加载时间,因为动态链接器必须处理较少的符号。

需要使用标志-fvisibility=hidden并标记应该可以通过__attribute__ ((visibility ("default")))导出的函数和类。

标记应由__attribute__ ((visibility ("hidden")))隐藏的函数和类

例如:

#define LIB_EXPORT __attribute__((visibility ("default")))
class LIB_EXPORT MyClass
{
//realisation
};