为什么惰性链接选项会导致 clang "illegal data reference" 错误?

Why does lazy linking option cause clang "illegal data reference" error?

当使用 中引用的 "lazy linking" link 选项“-lazy-lz”来延迟依赖动态库的加载时,linker 那是Xcode 7.2.1(Apple LLVM 版本 7.0.2 (clang-700.1.81))的一部分,生成此错误:

ld: illegal data reference to __ZN9WBRefSpecD1Ev in lazy loaded dylib

...其中损坏的 C++ 符号指的是我的单 class dylib 中的 class 析构函数:_WBRefSpec::~WBRefSpec()

我无法在任何地方找到直接参考来说明此错误可能意味着什么或可能导致它的原因。

在.cpp文件中,定义了析构函数:

EXPORT WBRefSpec::~WBRefSpec(void)
{
    ClearEntireRefSpec();  // commenting out this call doesn't affect error message!
}

...通常是 EXPORT:

#define EXPORT __attribute__((visibility("default")))

...当然,在头文件中定义为 class:

的 public 成员

~WBRefSpec(无效);

有人见过这个或知道导致此错误的原因吗?

编辑/回答:

非法数据引用的答案是,有一个 .cpp 文件,其中定义了一个 class 成员函数,声明 "static WBRefSpec foo;" 删除了那个,宾果游戏,没有 link 错误.

(删除了 link 详细信息,因为它们与问题无关)

对非法数据引用的回答是,有一个 .cpp 文件,其中定义了一个 class 成员函数,声明了 "static WBRefSpec foo;"

WBRefSpec& XMLErrorLogFile::GetLogFileInAppFolder()
{
    static WBRefSpec logFileInAppFolder;
    return logFileInAppFolder;
}

作为测试,我删除了静态和宾果游戏,没有 link 错误。

但注意: 在这种情况下只是编辑掉 "static" 将是一个非常糟糕的主意并产生另一个非常严重的问题:返回对分配在堆叠!

我想如果我创建一个 class 静态 WBRefSpec* 数据成员,并在我的函数中初始化它(但只初始化一次),那么问题也会消失。

具有讽刺意味的是,我选择该模式是基于对其他人 unrelated posting 的出色 SO 回答。