2016-05-13 90 views
1

当使用this question中引用的“lazy-lz”链接选项“-lazy-lz”来延迟依赖动态库的加载时,链接器是Xcode 7.2.1(Apple LLVM版本7.0.2(clang-700.1)的一部分0.81)),生成此错误:为什么懒链接选项会导致clang“非法数据引用”错误?

ld: illegal data reference to __ZN9WBRefSpecD1Ev in lazy loaded dylib 

...其中错位C++符号指的是在我的单级dylib类析构函数:_WBRefSpec ::〜WBRefSpec()

我不能t找到任何地方的直接参考,以指出这个错误可能意味着什么 - 或者可能导致它的原因。

在cpp文件,析构函数定义为:

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

...其中EXPORT是通常的:

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

...当然,在头文件中定义作为该课程的公众成员:

〜WBRefSpec(void);

任何人见过这个或有线索是什么原因导致此错误?

EDIT /解答:

答案数据非法参考的是,有一个与所定义的类成员函数声明的cpp文件“静态WBRefSpec FOO;”删除了,和宾果,没有链接错误。

(删除链接的详细信息,因为他们不相关的问题)

+0

发布您如何构建/链接您的完整程序,请 – xaxxon

+0

dylib可能需要将非惰性指针与另一个指针绑定才能工作。 –

+0

@xaxxon - 发布链接设置(某些路径“已消毒”)。我是否应该格式化它以包装更好的可读性? – SMGreenfield

回答

0

答案非法数据参考的是,有一个与定义的类成员函数声明为“静态WBRefSpec富.cpp文件; “

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

作为测试,我删除了静态和宾果,没有链接错误。

但要注意:在这种情况下只是编辑了“静态”将一个非常糟糕的主意,并创建另一个很严重的问题:返回堆栈上分配一个对象的引用!

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

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

相关问题