静态const初始化iPhone / Release

时间:2010-07-11 09:00:16

标签: c++ iphone objective-c static initialization

我有一个跨平台的库,只有在iPhone上才有奇怪的问题,而且只有在发布时才会出现。

// .h
class cColor 
{
public:
   static const cColor Red;
   static const cColor Green;
   static const cColor Blue;

   u8 r;
   u8 g;
   u8 b;
   u8 a;

   inline cColor(...) : ... { }
};

// .cpp
const cColor cColor::Red(0xFF, 0x00, 0x00);
const cColor cColor::Green(0x00, 0xFF, 0x00);
const cColor cColor::Blue(0x00, 0x00, 0xFF);

它看起来像初始化命令惨败,但问题不在静态方法中,而是在程序中稍后。所有的cColor :: Red,Green,Blue都设置为0.实际上我把一些printf放在构造函数的{}中并且它不打印任何东西,但也许它可以,因为它是在全局初始化期间。

现在最糟糕的部分:图书馆也在Release中工作,直到最近我添加了一些功能(200-300行)Objective-C代码,甚至没有执行。只是通过从代码大小切割我可以解决问题,但这不是我的选择。应用程序也不是那么大,内存也不是问题。

Btw cColor包含在库中的预编译头文件中,稍后包含在使用该库的应用程序中。

帮助!我真的没有想法。


编辑:这是更多信息...

我只将初始化代码从库移动到我的应用程序,现在是 常量正确初始化。

我真的认为链接器搞乱了。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

您可以轻松阻止静态初始化顺序惨败:http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.15

// .h
class cColor 
{
public:
   static const cColor& Red();
   static const cColor& Green();
   static const cColor& Blue();

   u8 r;
   u8 g;
   u8 b;
   u8 a;

   inline cColor(...) : ... { }
};

// .cpp
const cColor& cColor::Red() {
   static cColor* redColor = new Color(0xFF, 0x00, 0x00);
   return *redColor;
};

/* etc */

我不知道它是否有助于你的症状。

答案 1 :(得分:0)

我确信这是一个链接器错误。我刚刚发现了一个非常愚蠢的工作。我将一个内联函数从cColor类移动到cColor.cpp。除了静态const初始化之外,我在cColor.cpp中没有别的东西。

我的猜测是因为在某些情况下,翻译单元中没有其他内容,链接器会决定忽略它。

我可能会将此发送给苹果,以了解他们对此的看法。

P.S。只是为了说清楚我最初的想法是这是内存损坏但我的库/应用程序中没有任何静态内存分配。此外,我已经使用具有不同调试功能的多个内存管理器测试了代码,并且代码甚至无泄漏。

答案 2 :(得分:0)

这是库中静态插件的常见情况。必须将具有静态初始化的代码链接到主应用程序中。库只是.o文件的集合,在链接时,链接器选择要包含在最终可执行文件中的.o文件。如果主应用程序未引用这些变量,则链接器会确定目标代码未使用,因此.o不会被拉入,因此初始化程序不会初始化。快速测试是在主exe源(不在您的库中)中引用它们,或者尝试使用-Wl,-whole-archive-force_load标志来强制包含库中的所有.o对象。< / p>