C++ 为什么惰性链接选项会导致“叮当”声;非法数据引用“;错误?

C++ 为什么惰性链接选项会导致“叮当”声;非法数据引用“;错误?,c++,macos,linker,clang,dylib,C++,Macos,Linker,Clang,Dylib,使用中引用的“惰性链接”链接选项“-lazy lz”延迟相关动态库的加载时,作为Xcode 7.2.1(Apple LLVM 7.0.2版(clang-700.1.81))一部分的链接器会生成以下错误: ld: illegal data reference to __ZN9WBRefSpecD1Ev in lazy loaded dylib ……在我的C++类DyLI:yWBFFSPEC::~WBRFFEXECUTE()中,被破坏的C++符号是指类析构函数。 我在任何地方都找不到一个直接的引用

使用中引用的“惰性链接”链接选项“-lazy lz”延迟相关动态库的加载时,作为Xcode 7.2.1(Apple LLVM 7.0.2版(clang-700.1.81))一部分的链接器会生成以下错误:

ld: illegal data reference to __ZN9WBRefSpecD1Ev in lazy loaded dylib

……在我的C++类DyLI:yWBFFSPEC::~WBRFFEXECUTE()

中,被破坏的C++符号是指类析构函数。 我在任何地方都找不到一个直接的引用来指出这个错误可能意味着什么——或者是什么导致了它

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

EXPORT WBRefSpec::~WBRefSpec(void)
{
    ClearEntireRefSpec();  // commenting out this call doesn't affect error message!
}
…在通常的出口情况下:

#define EXPORT __attribute__((visibility("default")))
…当然,在头文件中定义为类的公共成员:

~WBRefSpec(无效)

有人见过这个错误,或者知道是什么导致了这个错误吗

编辑/答复:


非法数据引用的答案是存在一个.cpp文件,该文件定义了一个声明为“static WBRefSpec foo”的类成员函数;删除了该文件,而且宾果是,没有链接错误


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

非法数据引用的答案是存在一个.cpp文件,该文件定义了一个声明为“static WBRefSpec foo”的类成员函数

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

但是请注意:在这种情况下,仅仅编辑掉“static”是一个非常糟糕的主意,并且会产生另一个非常严重的问题:返回对堆栈上分配的对象的引用

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


具有讽刺意味的是,我选择这种模式是基于对其他人的优秀答案

非法数据引用的答案是存在一个.cpp文件,其中定义了一个声明为“static WBRefSpec foo”的类成员函数

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

但是请注意:在这种情况下,仅仅编辑掉“static”是一个非常糟糕的主意,并且会产生另一个非常严重的问题:返回对堆栈上分配的对象的引用

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


具有讽刺意味的是,我选择这种模式是基于对其他人的优秀答案

张贴如何构建/链接完整程序。动态库可能需要将一个非惰性指针与另一个指针绑定才能工作。@l'l--otool说动态库依赖于/System/Library/Frameworks/Carbon.framework/Versions/a/Carbon、/usr/lib/libstdc++.6.dylib和/usr/libSystem.B.dylib。这就是你的意思吗?很难避免这些,尤其是libstdc++@l'l'l--最后一点意见:非法数据引用的答案是存在一个.cpp文件,该文件具有声明为“static WBRefSpec foo”的类成员函数;删除了该文件,并且答对了,没有链接错误,请注意,动态库可能需要将一个非惰性指针与另一个指针绑定才能工作。@l'l--otool说动态库依赖于/System/Library/Frameworks/Carbon.framework/Versions/a/Carbon、/usr/lib/libstdc++.6.dylib和/usr/lib/libSystem.B.dylib。这就是你的意思吗?很难避免这些,尤其是libstdc++@l'l'l--最后一点意见:非法数据引用的答案是存在一个.cpp文件,该文件具有声明为“static WBRefSpec foo”的类成员函数;删除了该文件,并且答对了,没有链接错误。
WBRefSpec& XMLErrorLogFile::GetLogFileInAppFolder()
{
    static WBRefSpec logFileInAppFolder;
    return logFileInAppFolder;
}