我有一个跨平台的库,只有在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包含在库中的预编译头文件中,稍后包含在使用该库的应用程序中。
帮助!我真的没有想法。
编辑:这是更多信息...
我只将初始化代码从库移动到我的应用程序,现在是 常量正确初始化。
我真的认为链接器搞乱了。
有什么想法吗?
答案 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>