0163__linux动态链接库导出函数控制

linux动态链接库导出函数控制 - bitbit - 博客园

Linux 下 GCC 编译共享库控制导出函数的方法 - 小侠猫猫球 - 博客园

-fvisibility=default|internal|hidden|protected 是 GCC 编译器的一个选项,用于控制符号(函数、变量等)的可见性,不同的参数取值有着不同的作用,以下为你详细介绍:

  1. -fvisibility=default
    • 含义:这是默认的符号可见性设置。使用该选项时,符号的可见性遵循编译器和链接器的默认规则。通常情况下,全局符号对于其他共享对象(动态链接库)是可见的,即这些符号可以被其他模块链接和使用。
    • 示例场景:在一个大型项目中,如果你希望某些函数或变量能够被其他模块调用,并且不希望对它们的可见性做特殊限制,就可以使用默认的可见性设置。例如,一个公共的工具函数库,里面的函数需要被多个不同的模块使用,那么这些函数在编译时可以使用默认可见性。
  2. -fvisibility=internal
    • 含义:当设置为 internal 时,符号对于当前编译单元(.c 或 .cpp 文件)内部是可见的,但是对于其他编译单元是隐藏的。即使在链接时,其他模块也无法访问这些符号。这有助于减少符号冲突,并且可以将一些内部实现细节隐藏起来,不被外部模块看到。
    • 示例场景:在一个 C++ 类库中,有些辅助函数只是用于类的内部实现,不希望被外部用户调用。可以将这些函数的可见性设置为 internal,这样在链接其他使用该类库的程序时,这些内部函数就不会暴露出来。
  3. -fvisibility=hidden
    • 含义:符号对于当前共享对象内部是可见的,并且在链接时,该符号不会被导出到其他共享对象。这意味着其他共享对象无法直接链接到这些具有 hidden 可见性的符号。它可以有效减少共享对象的符号表大小,提高链接效率,同时也能隐藏一些不希望被外部访问的实现细节。
    • 示例场景:在开发动态链接库时,对于一些库内部使用的函数和变量,不希望被外部程序直接访问。可以将它们的可见性设置为 hidden,只有库内部的代码可以调用这些符号。
  4. -fvisibility=protected
    • 含义protected 可见性类似于 hidden,符号在当前共享对象内部可见,并且不会被导出到其他共享对象。不同之处在于,当使用 protected 时,在子类中可以访问基类中具有 protected 可见性的符号。这在面向对象编程中,特别是在继承关系中,对于控制符号的访问权限提供了一种更细粒度的方式。
    • 示例场景:在 C++ 中,设计一个基类,其中有一些函数和变量只希望被子类访问,而不希望被其他外部类或模块访问。可以将这些成员的可见性设置为 protected,通过继承关系,子类可以使用这些 protected 符号来扩展或修改基类的行为。

使用这些可见性选项时,需要根据项目的实际需求和设计目标来选择合适的设置,以达到控制符号访问权限、减少符号冲突和提高代码安全性的目的。同时,不同的编译器对这些选项的支持和行为可能会略有差异,在跨平台开发时需要特别注意。

你可能感兴趣的:(0016__C/C++,笔记)