2011-01-19 47 views
0

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

谢谢。

回答

2

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

导出你的框架接口

当你建立一个使用Xcode的框架或应用程序,链接器的出口都在你的代码默认定义的符号。对于具有许多符号的运输框架,这可能会导致运行时出现性能问题。加载框架时,动态链接编辑器将加载与框架相关联的符号。如果一个框架包含许多私有函数,那些私有函数的符号将不会被使用,但仍然与公共函数的符号一起被加载。加载这些额外的符号不仅会浪费内存,还需要更多的工作才能在符号查找期间遍历列表。

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

创建您的exports文件

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

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

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

要导出在此输出中规定的框架功能,您可以创建带有这个文本的文本文件:

_InitCocoaFW 
_addNumbers 
_getInitDate