在iOS静态库中隐藏C ++符号?

时间:2010-11-04 10:39:55

标签: c++ static ios symbols

我用纯C ++制作了一个iOS代码库,我打算将它发布给很多人。据我所知,在撰写本文时,在iOS上共享编译代码的唯一方法是通过静态库。

不幸的是,代码中有一些聪明的部分我想隐藏在公众视野之外。我想做的只是公开单个(简单)接口类的符号,并隐藏其他所有内容。这可能吗?

关于如何隐藏我的符号的任何其他想法也非常受欢迎。谢谢你的时间!

5 个答案:

答案 0 :(得分:3)

解决了!我最终首先包括单个cpp中的所有源代码。其次,我将所有非外部内容放在一个未命名的命名空间中。然后,为了摆脱剩余的符号,我将这个脚本添加到构建过程中:

echo MyGlobalFunctionToInstantiateMainClass > "${BUILT_PRODUCTS_DIR}/save_symbols"
strip -s "${BUILT_PRODUCTS_DIR}/save_symbols" -u "${BUILT_PRODUCTS_DIR}/lib${PRODUCT_NAME}.a"

除去MyGlobalFunctionToInstantiateMainClass。

之外的所有全局符号

答案 1 :(得分:2)

这取决于您认为的“公众观点”。

如果你的代码分布在多个源文件中,那么如果你想隐藏链接器的内部符号,那么你很不幸。静态库实际上是单个目标文件的归档,因此在将库链接到应用程序时,链接器必须处理它们。 如果库是基于模板的,那么你也不走运。最终程序的编译器必须能够查看所有相关模板,因此您无法隐藏它们 如果库由单个源文件组成,则可以使用匿名命名空间为所有内部符号提供不可用的名称,使其不能用于所有实际目的。

如果您害怕人们会从内部符号的名称中学到太多东西,那么要么在构建版本之前不使用这些描述性名称或通过混淆器运行代码。

答案 2 :(得分:0)

我发现将所有源文件编译为单个编译单元,方法是将它们包含在复合.cpp中,并将除一个公共类之外的所有内容放入一个未命名的命名空间中隐藏大部分符号。

但是,内联和静态方法名称仍会出现在静态库中。有什么方法可以阻止这种情况吗?

答案 3 :(得分:0)

解决重复符号或隐藏的最佳方法是混淆c / c ++源代码。

答案 4 :(得分:0)

我们遇到了同样的问题并解决了这个问题而无需将所有代码合并到一个源文件中,请参阅我在此处为相关问题撰写的答案:https://stackoverflow.com/a/16492468/1086196