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()的主要内容,如果未能解决你的问题,请参考以下文章