当前位置: 首页 > 面试题库 >

使用g ++的符号可见性

张晔
2023-03-14
问题内容

我在Linux / Mac下编译了一个C ++库,其中隐藏了符号。我对所有类都使用了 _属性 _((visibility(“
hidden”)))
,并使用选项(-c -O2 -fPIC -MMD -MP
-MF)进行了编译。在Mac上,使用MacDependencies(http://code.google.com/p/macdependency/),就可以很好地完成工作,因为我只看到我的出口(实际上我看到了之前和之后的区别)。

但是,我注意到使用 nm 仍然可以看到符号的所有名称。在Mac和Linux下都会发生这种情况。

这是为什么?有什么办法可以避免这种情况?

最好的问候和感谢,乔


问题答案:

公共或隐藏的符号仍然存在。nm显示所有符号。区别在于隐藏的符号对于动态链接器不可用,即,不能导出,也不能插入。

您可能还会喜欢以下内容 man gcc

   -fvisibility=default|internal|hidden|protected
       ...
       A good explanation of the benefits offered by ensuring ELF symbols
       have the correct visibility is given by "How To Write Shared
       Libraries" by Ulrich Drepper (which can be found at
       <http://people.redhat.com/~drepper/>)---however a superior solution
       made possible by this option to marking things hidden when the
       default is public is to make the default hidden and mark things
       public.  This is the norm with DLL's on Windows and with
       -fvisibility=hidden and "__attribute__ ((visibility("default")))"
       instead of "__declspec(dllexport)" you get almost identical
       semantics with identical syntax.  This is a great boon to those
       working with cross-platform projects.


 类似资料:
  • 问题内容: 在类的前面和构造函数的前面使用修饰符(在本例中为package- private)有什么区别?我认为构造函数前面的修饰符意味着可以实例化该类的实例。但是班级前面的修饰符呢? 问题答案: 首先,由3个访问修饰符创建4个访问级别。 公共-随处可见 受保护-可在同一个包装中以及儿童中使用 默认-仅在同一程序包中可访问 私人-仅在同一班级可以访问。 您是正确的-构造函数级别的修饰符与类的实例直

  • 问题内容: 我正在尝试编译使用JNI的Java库。当我启动程序时,我看到一个UnsatisfiedLinkError崩溃,它表明在DLL中找不到特定的方法。 通过仔细检查,我发现用于编译和链接的g ++通过在方法名称后添加诸如“ @ 8”或“ @ 16”之类的后缀来破坏我的方法名称。有人知道禁用名称修饰的正确编译器选项吗?提前致谢! 编辑 :我正在通过Eclipse + CDT插件使用MinGW。

  • Kotlin中这些修饰符是与我们Java中的使用是有些不同的。在这个语言中默认的修饰符是public,这节约了很多的时间和字符。但是这里有一个详细的解释关于在Kotlin中不同的可见性修饰符是怎么工作的。

  • 有人能解释一下printf中的是如何使用说明符“%g”的吗?下面的输出让我很困惑: 我了解到使用最短的表示形式。 但是下面的输出仍然让我困惑 我的问题是:为什么能给出确切的数字,而不能? 似乎16个有效数字是准确的。有人能告诉我原因吗?

  • private private修饰符是我们使用的最限制的修饰符。它表示它只能被自己所在的文件可见。所以如果我们给一个类声明为private,我们就不能在定义这个类之外的文件中使用它。 另一方面,如果我们在一个类里面使用了private修饰符,那访问权限就被限制在这个类里面了。甚至是继承这个类的子类也不能使用它。 所以一等公民,类、对象、接口……(也就是包成员)如果被定义为private,那么它们只

  • 有隐形字符吗?我在Google上查看了隐形字符,最终得到了许多答案,但我不确定这些答案。Stack Overflow上的人能告诉我更多关于这方面的信息吗? 我还检查了脸书的个人资料,发现这个用户的个人资料上没有任何名字?这怎么可能?是数据库的问题吗?黑客之类的? 当我在网上搜索时,我发现< code>200D是一个带有隐形字符的ASCII值。是真的吗?