强制包含不导出任何符号的静态库对象文件(GCC / iPhone)

时间:2009-09-20 10:39:34

标签: iphone ios gcc linker static-libraries

我正在创建一个用于iPhone应用程序的静态库。它包含许多不导出符号的源文件,他们所做的只是实例化一个类的静态实例,然后在其构造函数中运行一些代码,在其他地方使用中央管理器类注册各种事物。当代码构建为标准iPhone应用程序的一部分时,这一切都可以正常工作,但当它被分成静态库时,这些文件不会成为最终的应用程序二进制文件,因此它们包含的私有类实例的构造函数不要跑,这会引起问题。我已经关闭了每个构建选项来处理静态库构建和最终应用程序构建的死剥离等等。

我刚刚在Metrowerks编译器上遇到过这个问题,但是在那个实例中,即使代码被构建到没有任何中间库的单个应用程序中,也会发生这种情况。解决方案非常简单:只需在私有类实例上使用__declspec(force_export)即可。

GCC / iPhone有没有相应的?我正在使用Xcode 3.1.4和GCC 4.2并针对iPhone OS 3.1。或者有一些方法告诉应用程序链接静态库中的每个目标文件,无论它是否被显式引用?我已经确认使用ar表示整套目标文件正在进入静态库。

提前致谢。

2 个答案:

答案 0 :(得分:5)

我认为您正在寻找的选项是-all_load

   -all_load
       Loads all members of static archive libraries.  See man ld(1) for
       more information.

答案 1 :(得分:3)

如果您碰巧链接了许多库和/或框架(Mac OS X),

-all_load会出现一些问题。在这种情况下,您应该只使用-force_load

强制来自特定库的所有符号
g++ test.cpp -o test -force_load libtoload.a