关于 Linux 中的共享库,有没有办法在库中选择导出函数?

Posted

技术标签:

【中文标题】关于 Linux 中的共享库,有没有办法在库中选择导出函数?【英文标题】:About shared library in Linux, is there a way to select export functions in a library? 【发布时间】:2013-11-14 05:36:15 【问题描述】:

我在这里阅读了教程: http://www.techytalk.info/c-cplusplus-library-programming-on-linux-part-two-dynamic-libraries/

在我看来,Windows 平台上没有类似dllexport 的 DLL 的功能。

有没有办法选择库中的某些函数作为导出函数,并使库中的其余函数对外部调用不可见?

【问题讨论】:

看看Visibility 【参考方案1】:

您可能想使用 GCC 的 visibility function attribute。

查看GCC visibility wikipage 并阅读Drepper's paper 如何编写共享库

【讨论】:

【参考方案2】:

有多种方法可以做到这一点。

要么使用 Basiles 答案中提到的可见性函数属性,要么使用链接器版本脚本来完成这项工作。

在链接描述文件中,您列出了所有要导出的函数。这是一个例子:

文件:MyLinkerScript.exp


global: 
  myExportedFunction1;
  myExportedFunction2;
  myExportedFunction3;
local: *;
;

在共享库的链接步骤中,您只需将以下额外参数传递给 gcc:

-Wl,--version-script=MyLinkerScript.exp

之后,共享库中的所有符号都将是私有的,但版本脚本的全局部分中列出的符号除外。

【讨论】:

以上是关于关于 Linux 中的共享库,有没有办法在库中选择导出函数?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以防止 C 共享库中的函数覆盖?

使用 CMake 在库中查找符号

使用make

Linux下C/C++动态库在运行时是怎样加载进来的

byte* 不会在库中保持“000000”

C++ 静态库中的共享全局变量:Linux