在编译C代码时,如何指定要从.so库导出的函数?

在编译C代码时,如何指定要从.so库导出的函数?,c,C,我的C代码中有很多函数。编译.so时,我会在result.so文件中看到所有名称。我如何指定(在代码或make file中)只导出某些函数,而其他函数是仅供内部使用的私有函数。在C中,如果希望函数保持在包含它的文件(技术上称为“编译单元”)的内部,则将其声明为“静态”。比如说, static int privateAddOne(int x) { return x + 1; } 既然您提到了.so文件,那么使用gcc或类似于gcc的编译器似乎是合理的假设 默认情况下,链接对象中的所有extern

我的C代码中有很多函数。编译.so时,我会在result.so文件中看到所有名称。我如何指定(在代码或make file中)只导出某些函数,而其他函数是仅供内部使用的私有函数。

在C中,如果希望函数保持在包含它的文件(技术上称为“编译单元”)的内部,则将其声明为“静态”。比如说,

static int privateAddOne(int x) { return x + 1; }

既然您提到了
.so
文件,那么使用
gcc
或类似于gcc的编译器似乎是合理的假设

默认情况下,链接对象中的所有
extern
函数都可见。您可以使用
hidden
属性逐个隐藏函数(和全局变量)(同时保留它们
extern
,这允许它们从同一库中的其他源文件中使用):

或者,您可以通过在编译时将
-fvisibility=hidden
选项传递到
gcc
来将默认值更改为
hidden
。然后,可以使用以下方法标记要导出的特定函数:

__attribute__((visibility("default")))

我认为.def文件可以用于此目的。+1老实说,这是一个比公认的更好的答案(因为它更强大)。当然,你应该混合使用这两种方法+1要添加另一个选项,您可以使用ld linker和版本脚本的组合来实现类似的结果,而无需接触源代码。这个答案是正确的,但您永远不应该使用它。依赖于隐藏具有可见性的符号以避免污染命名空间和破坏调用程序的代码本质上是不可移植的。如果您需要不应该在库本身之外使用的外部函数,只需在它们的名称前面加上一些特定于库的垃圾(但不是前导下划线)。@R:即使您正确使用了符号前缀,这仍然是值得优化的,因为它将减少符号表的大小。编译单元的私有和库的私有几乎是一回事——大多数非平凡库都有许多源文件。
__attribute__((visibility("default")))