我的静态C ++库包含一些带有构造函数的全局对象。测试程序是用Apple的gcc 4.2.1构建的,运行后可以看到对象是零初始化的,但是没有调用构造函数。任何静态类成员变量都是如此。
可以通过向-force_load
提供ld
选项来解决此问题,但由于可执行文件的大小,这种方式并不好。我尝试从文件中引用函数,其中定义了全局对象,但它没有起作用。
在Linux(gcc 4.5.1)下构建相同的代码时,没有这样的问题。
答案 0 :(得分:0)
这是因为在将二进制文件链接到存档(.a)时,链接器仅从存档中提取二进制文件中未解析的符号。也就是说,如果二进制文件没有引用归档中的全局(或静态)对象,则该对象的符号及其初始化代码将不会被链接。
这是归档和未引用的全局对象的常见问题。常见的解决方案是以某种方式从二进制文件中引用该对象(例如,取其大小)。或者为该库提供一个初始化函数,该函数执行全局对象的构造函数应该执行的操作,并使您的二进制调用成为函数。