防止在静态库中调用函数

时间:2011-01-19 09:30:35

标签: ios

我使用xcode为IOS创建了一个静态库。在C ++中,如果需要从其他程序调用类,则需要添加“__declspec(dllexport)”来导出类。在xcode中,不需要导出。有没有办法阻止调用库中我想要公开给其他程序的函数?

感谢。

1 个答案:

答案 0 :(得分:2)

http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPFrameworks/Tasks/ExportingInterfaces.html

导出框架界面

使用Xcode构建框架或应用程序时,链接器默认导出代码中定义的所有符号。对于具有许多符号的运输框架,这可能会导致运行时出现性能问题。加载框架时,动态链接编辑器会加载与框架关联的符号。如果框架包含许多私有函数,则不会使用这些私有函数的符号,但仍会与公共函数的符号一起加载。加载这些额外符号不仅会浪费内存,还需要在符号查找期间更多地处理列表。

在Xcode中,您可以通过在链接器选项中指定导出文件来限制可执行文件导出的符号。

创建导出文件

导出文件是一个简单的文本文件(.txt或其他文本文件扩展名),其中包含要导出的符号列表。要创建文件,请在Xcode项目中添加一个新的空文件。在此文件中,添加要导出的符号列表,每行一个符号。

对于基于ANSI C的代码,通常只需在下划线字符前加上函数或变量的名称,即可获得符号名称。对于使用损坏的符号名称的C ++等语言,您可能需要运行nm工具来获取现有符号名称列表。使用-g选项运行nm以查看当前导出的符号。然后,您可以复制工具的输出并将其粘贴到导出文件中,从而删除任何无关的信息。以下文本显示了由nm生成的Cocoa框架的一些示例输出:

U .objc_class_name_NSDate
b000ad54 T _InitCocoaFW
b000aea8 T _addNumbers
b000ade8 T _getInitDate
U _objc_msgSend

要导出此输出中指定的框架函数,您将使用以下文本创建一个文本文件:

_InitCocoaFW
_addNumbers
_getInitDate