在 Qt 中链接 obj 文件

Posted

技术标签:

【中文标题】在 Qt 中链接 obj 文件【英文标题】:Linking obj file in Qt 【发布时间】:2014-07-07 17:12:48 【问题描述】:

我需要在我的 c++ 项目中使用由 Jonathan Shewchuk 开发的 triangulation library。问题是必须将 C 文件编译成我使用提供的 make 文件和 Visual Studio 编译器完成的目标文件。这会生成 triangle.exe 和 triangle.obj。

此外,在 Qt 中,我将头文件 triangle.h 和对象作为 LIBS += path/triangle.obj 包含在内

由于 triangle.c 中有 main 函数,我得到以下链接错误:

LNK2005 that _main is already defined in main.obj

LNK2019 unresolved external symbol _triangulate reference

我以前从未使用过对象引用,所以如果有人可以帮助我解决这个问题。

【问题讨论】:

从源代码中需要定义TRILIBRARY。请参阅 triangle.c 中的 main() or triangulate() Gosh, do everything. 我后来得到了,但最后我得到了 LNK1561 - 必须定义入口点。它创建了目标文件和可执行文件,但给了我这个错误。你知道为什么吗? 【参考方案1】:

首先,让我们非常简单地向您解释一下基础知识。

在 C/C++ 中,编译时首先生成目标文件 (.o)。它们由二进制形式的函数定义组成,但无法执行。

之后,您调用链接器来链接这些对象文件以生成可执行文件。

在一个程序中,你只能有一个主函数,一个唯一的入口点。

当你写LIBS += path/triangle.obj时,这是不对的。 Windows 上的库是 .dll(动态)或 .a(静态)文件。

为了解决您的问题,我看到了两种不同的解决方案:

1- 最简单!

创建一个 Qt/C++ 程序,它会在您需要时调用您的“三角测量可执行文件”。这样您就可以使用不同的编译器等单独编译它们... 您可以使用QProcess 类启动外部程序。

2- 不太容易:/

从删除主要功能开始修改源文件,配置 Qt/make 使其具有适当的编译命令行以使其工作。我不想解释更多,因为我强烈建议您选择第一个解决方案;)

【讨论】:

我认为(实际上还没有尝试过)LIBS += path/triangle.obj 在某种意义上很好,它将 .obj 文件添加到链接中。如果“库”真的只是单个目标文件(因此,从单个源文件生成),那根本没有错。 哦,好吧!感谢您的评论;) 我发现我可以简单地合并库 (.lib) 中的几个目标文件。我刚刚合并了一个我拥有的并且它正确链接。谢谢你的想法。

以上是关于在 Qt 中链接 obj 文件的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 QtSQL 编译 Qt 项目(链接器错误)

Qt Vs addin - 不为 moc_*.cpp 文件生成 .obj 文件

CUDA、Win7、Qt Creator - LNK1104:无法打开文件“<cuda 文件>.obj”

Qt 与 OpenCV:LNK2019:未解析的外部符号和未找到文件 mainwindow.obj

LNK1181:无法打开输入文件 'D:\programs\gdcm-2.6.2\qt-build\bin.obj'

合并 c++ obj 文件以进行 C 链接