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

ale*_*2k8 4 c

我的"C"代码中有许多功能.当我编译.so时,我在结果.so文件中看到所有名称.如何指定(在代码或make文件中)只应导出某些函数,而其他函数仅供内部使用.

caf*_*caf 18

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

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

int __attribute__((visibility("hidden"))) foo(void)
{
    return 10;
}
Run Code Online (Sandbox Code Playgroud)

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

__attribute__((visibility("default")))
Run Code Online (Sandbox Code Playgroud)

  • +1 老实说,这是一个比公认的更好的答案(因为它更强大)。当然,您应该混合使用两者! (3认同)

Dav*_*har 7

在C中,如果您希望函数保留在包含它的文件内部(技术上,"编译单元"),则将其声明为"静态".例如,

static int privateAddOne(int x) { return x + 1; }
Run Code Online (Sandbox Code Playgroud)

  • 私有的编译单元和私有的库几乎是不一样的 - 大多数非平凡的库有很多源文件. (2认同)