LNK2019:从 Windows 到 OSX 的可移植性

Posted

技术标签:

【中文标题】LNK2019:从 Windows 到 OSX 的可移植性【英文标题】:LNK2019: Portability from Windows to OSX 【发布时间】:2013-05-08 15:24:40 【问题描述】:

过去几天我一直在研究这个问题,但没有成功。我一直在尝试用 Qt 创建一个图形应用程序。看来我的 LNK2019 应该来自一个未实现的构造函数:

main.obj:-1: error: LNK2019: unresolved external symbol "public: __cdecl            ArbObject::ArbObject(class Table *,int *,int,int,int,int,int)" (??
0ArbObject@@QEAA@PEAVTable@@PEAHHHHHH@Z) referenced in function "class std::vector<class ArbObject *,class std::allocator<class ArbObject *> > __cdecl 
createArbObjects(class QList<class QStringList> &,class Table *,int &)" (?createArbObjects@@YA?AV?$vector@PEAVArbObject@@V?$allocator@PEAVArbObject@@@std@@@std@@AEAV?   
$QList@VQStringList@@@@PEAVTable@@AEAH@Z)

但是,构造函数在那里并在适当的 .cpp 文件中实现。

.h file has this:
 ArbObject(Table* tr, int* rgb, int t, int xpos, int ypos, int w, int h);

.cpp file has this:
ArbObject::ArbObject(Table* tr, int* rgb, int t, int xpos, int ypos, int w, int h)
    : QWidget((QWidget*)tr), obj_typ(t), xpos(xpos), ypos(ypos),wid(w), hei(h)

...

我已经包含了我能想到的所有内容。这在我的 Windows 机器上不起作用,但它在我的 Mac 上运行良好。我的问题是,什么样的依赖会导致这种问题?我还可以探索哪些其他途径来解决我的问题?

它是基于编译器的吗? MSVC 与 Clang 是否在链接过程中都包含不同的文件,因此它可能无法在一个平台上运行,而不是在另一个平台上运行。

编辑:已修复

看看答案!

【问题讨论】:

您是否尝试过在 Windows 上使用 MinGW 编译器编译您的应用程序?你使用的是什么版本的 Qt? 构造函数应该始终是 __thiscall,而不是 __cdecl。很难看出你是怎么做到的。 @HansPassant,这是我在编译器引用的函数中的行 ArbObject *a = new ArbObject(table, RGB, typ, xpos, ypos, width, height);这里的所有值都是整数,除了 table 和 RGB。它也说找不到文件:main.obj。也许它使用的是旧版本的 main.obj 文件,但重建根本不会改变这一点。 @Cameron Tinker,我已经设置了 MinGW 编译器,添加了构建工具包并将其设置为默认值,我得到了相同的消息。我正在使用 Qt 5.0.2 【参考方案1】:

事实证明,实际上是我构建代码的方式决定了编译器错误。我不知道确切原因,但确实如此,但这可能是由于我构建代码的方式。

之前,我在 main.cpp 文件中包含了一个带有相关创建函数的 parser.h 文件。我的理由是 parser.h 文件将包含在 main.cpp 文件的顶部。 parser.h 本质上是一个让长函数看不见的地方。

现在,我为解析/创建创建了一个单独的类,它具有创建 arbobjects、balls 等的方法。主函数创建解析器的一个实例并使用这些方法。这使它编译时没有链接器错误

【讨论】:

以上是关于LNK2019:从 Windows 到 OSX 的可移植性的主要内容,如果未能解决你的问题,请参考以下文章

Windows RPC 编程错误:LNK 2019 unresolved external symbol RPCServerListen

在 Windows 上使用 Clang 链接 SDL2 时出错“LNK1561:必须定义入口点”

无法链接 GLFW C++;添加了 .dll、.h、.lib,但仍然获得 LNK2019

LNK2019:从 CPP 代码调用 C 函数

LNK2019:未解析的外部符号,在不存在的 *.obj 文件中搜索

"error LNK2019: 无法解析的外部符号"原因分析