【问题标题】:Qt sub-project undefined reference to `main'Qt 子项目未定义对“主”的引用
【发布时间】:2015-04-30 08:13:15
【问题描述】:

我正在使用 Qt 学习 Model-View-Presenter (MVP) 模式并拥有 follow example。我可以构建它并从构建文件夹运行它,但由于错误而无法调试它:

.../glibc-2.19/sysdeps/x86_64/start.S:118: error: undefined reference to `main'
error: collect2: error: ld returned 1 exit status

我不知道出了什么问题?快速的谷歌搜索带来的信息不多。 PS:我使用 OpenSUSE 13.1 和 Qt 4.8

【问题讨论】:

  • 这是一个链接器错误,您应该在构建程序时得到它,这意味着您无法运行它。你确实在你的程序中有main函数吗?
  • 是的,我在子项目Presenter 中有main()。如果你使用linux,你可以去deployment文件夹,程序可以从那里运行。
  • 您使用的是哪个 IDE?
  • 嗨,我使用的是 QtCreator 2.8.1

标签: c++ qt debugging mvp


【解决方案1】:

您使用的subdirs 模板错误。它不应包含任何内容,但应包含 SUBDIRS 和有时 CONFIG += ordered。您的项目模型也有点复杂。您应该先尝试一些更简单的方法,不要使用库和子项目。

子目录项目的好例子:How to use QMake's subdirs template?

更新

我会解释一下。您需要在项目中进行的最小更改才能编译和链接:

  1. WiringClone.pro 中删除SOURCES = $$PWD/Presenter/main.cpp
  2. CONFIG += ordered 添加到WiringClone.proView.pro
  3. WiringClone.pro 中删除config \ 行(这是导致原始链接错误的行)
  4. 订购子项目。 WiringClone.pro:Utilities Model View Presenter,View.pro:Logic GUI

但是,即使进行了所有这些更改,您也必须解决一个无法解决的问题:您的 Utilities 库取决于您的 Model 库,但您的 Model 取决于您的 Utilities。链接不能以这种方式工作。不允许循环依赖。这就是为什么我建议您先释放所有库并编写一个简单的可靠可执行文件。

【讨论】:

  • 你的意思是根项目?在链接器抱怨undefined reference to main'`后,我添加了SOURCES = $$PWD/Presenter/main.cpp。但它不起作用。
  • 我已经做了一个类似的小项目,但每个代码文件都在同一个目录中。所以我想多走几步:重新架构...
  • 这里的第一步是将文件移动到不同的目录并将它们添加到项目中,如下所示:'SOURCES += src/model/model.cpp src/view/view.cpp'等。第二步是学习如何使用pri文件。第三步是编写一个子目录,它只包含 2 个项目——一个库和一个使用它的可执行文件。只有在做完所有这些之后,你才能尝试一些复杂的东西,就像你的例子一样。是的,生活就是痛苦^_^。
  • 谢谢,它有效 :D 你对UtilitiesModel 之间的循环依赖有什么建议吗?我想我应该将Utilities 合并到WiringModel 的方法中。
  • 是的,您绝对应该将某些内容合并到其他内容中。例如Utilities 变成Model
猜你喜欢
  • 2011-02-27
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-30
  • 2015-05-14
相关资源
最近更新 更多