2010-11-04 169 views
0

我已经在纯C++中创建了一个iOS代码库,我打算发布给很多人。据我所知,在撰写本文时,在iOS上共享编译代码的唯一方法是通过静态库。在iOS静态库中隐藏C++符号?

不幸的是,在代码中的一些聪明的位,我想从公众视线中隐藏其中。我想要做的只是暴露单个(简单)接口类的符号,并隐藏其他所有内容。这可能吗?

如何隐藏自己的符号任何其他的想法也非常欢迎。谢谢你的时间!

回答

2

解决了!我首先将所有源代码包含在单个cpp中。其次,我把所有非外部的东西放在一个未命名的名字空间中。然后摆脱剩余符号的我加入这个脚本生成过程:

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

它剥离了除MyGlobalFunctionToInstantiateMainClass所有全局符号。

2

这取决于你认为是“公共视角”。

如果你的代码分布在多个源文件,则在很大程度上是出于运气,如果你想隐藏链接器内部的符号。静态库实际上是单个对象文件的存档,因此在将库链接到应用程序时,它们全都由链接器处理。
如果库很大程度上基于模板,那么你的运气也不好。最终程序的编译器必须能够看到所有相关的模板,所以你无法隐藏它们。
如果库包含单个源文件,则可以使用匿名命名空间为所有内部符号提供这样一个无法修改的名称,以使其不可用于所有实际目的。

如果你害怕人们会学到太多的内部符号的名称,则要么不使用这种描述性的名称或建立一个发布之前运行经过模糊处理的代码。

+0

谢谢,巴特!这是我怀疑的。如果我可以很好地将它集成到构建过程中,代码混淆器将起作用。你知道任何好的吗? – Simplex 2010-11-04 18:53:21

0

我发现,通过将其包括在复合的.cpp,并把一切,但一个公共类为具名命名空间编译所有的源文件作为一个单一的编译单元隐藏了大部分的符号。

然而,内联和静态方法的名字仍出现在静态库。有什么办法可以防止这种情况发生?

0

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