Qt - 引用项目的 main() 函数覆盖实际项目的 main()

Posted

技术标签:

【中文标题】Qt - 引用项目的 main() 函数覆盖实际项目的 main()【英文标题】:Qt - main() function of referenced project covering main() of the actual project 【发布时间】:2012-03-20 06:15:13 【问题描述】:

我正在 Qt Creator 中创建一个单元测试 Qt 项目,该项目引用了我想要测试的项目中的文件。现在,无论我是通过 .pri 文件引用我想测试的类,还是通过将相关文件直接添加到单元测试项目的 SOURCES 和 HEADERS 变量中(而且 .pri 文件似乎真的做同样的事情,它只包含 SOURCES 和HEADERS 条目),从主项目添加文件似乎会覆盖单元测试项目中的 main.cpp。

我的意思是,当我构建并运行 uni tests 可执行文件时,原始项目的 main() 函数会运行!如果我重命名原始项目中的 main.cpp 或单元测试项目中的 main.cpp(更改其 .pro 文件),那么事情就会顺利进行。好吧,我可以接受这样的解决方案,但这有点不舒服,因为在未来的某一天,我可能会不小心为这两个项目中的某些文件使用相同的名称,谁知道呢,可能会遇到错误,这将是一场噩梦.除此之外,我只是好奇这种行为的原因是什么。

当然 .pri 文件只包含类头文件和 cpp 文件,而不是原始应用程序的 main.cpp,例如就我而言:

HEADERS += \
    ../Project/fooclass.h

SOURCES += \
    ../Project/fooclass.cpp

另外两个项目都在彼此相邻的目录中,而不是嵌套的。

编辑:Frank Osterfeld 要求查看我的测试的 pro 文件,所以这里是:

测试的专业文件:

QT       += core
QT       -= gui
QT += testlib

TARGET = Tests
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

SOURCES += \
    test_class.cpp \
    main_unit_tests.cpp

HEADERS += \
    AutoTest.h \
    test_class.h \

include(trial.pri)

Trial.pri 包含我要测试的主项目中的文件。 main_unit_tests.cpp(从原始 main.cpp 重命名为临时解决方案)包含:

#include <QtCore/QCoreApplication>
#include "AutoTest.h"

TEST_MAIN

TEST_MAIN 在 AutoTest.h 中定义为

#define TEST_MAIN \
  int main(int argc, char *argv[]) \
   \
    return AutoTest::run(argc, argv); \

访问page 了解 AutoTest.h 的作用。简而言之,它使使用 Qt 框架运行多个单元测试变得少了一些麻烦。


编辑: 亲。主项目的文件(即包含我要测试的类)是:

QT       += core
QT       -= gui

TARGET = Project
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

SOURCES += main.cpp \
    fooclass.cpp

HEADERS += \
    fooclass.h

它位于路径上:...\Unit_Test\Project 而单元测试项目位于路径上: ...\Unit_Test\Tests 现在一切正常,因为定义 main() 的文件在两个项目中都不同。一旦我将它们重命名为相同,单元测试项目就会执行原始项目的主要功能。

【问题讨论】:

能否请您同时显示 .pro 和 .pri。如果两个项目都在不相关的目录中,并且您没有包含基本应用程序的main(),我几乎看不出这是怎么可能的。 我无法看到这是如何发生的...如果您希望我进一步了解,请提供包含完整来源的 .tar/.zip。 @Koying - mediafire.com/?32q82e3h77hw1m0 只要我将“测试”项目中的 main.cpp 更改为任何其他名称,事情就会按预期工作。我能够通过其他一些小项目重现它,这似乎不是一次性的故障。 makefile中有MSVC2010的痕迹。您实际上是如何编译项目的? @Koying - 我在 QT Creator 下使用 MS Visual Studio C++ 工具链进行构建。我在这里发布的内容不需要它,但通常我需要使用为 Visual Studio 编译的 dll,因此不能使用默认的 MinGW 工具。 【参考方案1】:

文件名无关紧要,重要的是单元测试的构建中包含了多少 main() 函数。不要在单元测试项目的 SOURCES 中包含实际应用程序的 main.cpp,应该没问题。

【讨论】:

基本应用程序的 main.cpp 从未包含在单元测试项目的源代码中。单元应用程序的 main.cpp 无法删除,因为没有定义 main() 函数的文件(当然,除非我在不同的文件中定义 main,这就是我现在正在做的)。 使用 QTEST_MAIN() 来定义测试的主函数。如果不是为测试而构建的,我看不到基本应用程序的 main() 函数如何运行?您的测试的 .pro 文件是什么样的?【参考方案2】:

GNU make 实用程序不是最好的。

如果您在同一文件夹中创建实际应用程序和测试项目的 obj 文件,则可能会链接错误的main.o

确保您的测试项目和实际应用项目构建文件夹不同,或者干脆不要使用 main.cpp 文件名两次。

【讨论】:

构建目录,以及源目录(当然引用文件除外)是不同的。

以上是关于Qt - 引用项目的 main() 函数覆盖实际项目的 main()的主要内容,如果未能解决你的问题,请参考以下文章

在单元测试期间获取引用项目的路径

来自引用项目的 ASP.NET 自定义配置部分不起作用?

在另一个项目 c# 中使用引用项目的 WCF 服务

在一个多模块的python项目中,如何在子模块中引用项目的根目录?

如何使用项目的其他值搜索 Vuetify 数据表

c++ 中的 range-for 会调用项目的复制构造函数吗?