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

Qt - main() function of referenced project covering main() of the actual project

本文关键字:项目 main 函数 引用 Qt-main 覆盖      更新时间:2023-10-16

我正在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要求查看我的测试专业文件,所以它在这里:

测试的专业文件:

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); 
}

访问此页面了解AutoTest.h的功能。简而言之,它可以减少使用Qt框架运行多单元测试的麻烦。


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

QT       += core
QT       -= gui
TARGET = Project
CONFIG   += console
CONFIG   -= app_bundle
TEMPLATE = app
SOURCES += main.cpp 
    fooclass.cpp
HEADERS += 
    fooclass.h

它就在这条路上:。。。\单元测试\项目而单元测试项目位于以下路径上:。。。\单元测试\测试现在,由于两个项目中定义main()的文件不同,所以一切都很顺利。一旦我将它们重命名为相同,单元测试项目就会排除原始项目的主要功能。

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

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

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

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