在msys 2/ ucrt / gcc 12、c++ 23、qt 6和cmake中,未定义对`qMain(int,char**)'的引用错误

3qpi33ja  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(233)

我尝试在Windows 10上编译一个简单的C++ / Qt程序,使用:

  • msys2 / ucrt / gcc 12.2
  • C++标准23
  • msys2 / Qt6
  • cmake 3.25.1
  • 忍者1.11.1

我没有使用任何IDE或Power Shell,只是notepad++和Windows命令提示符。
我的program.cpp是:

#include <QApplication>
#include <QLabel>

int main()
{
    int argc = 1;
    const char* argv[1] { "prog" };
    QApplication app { argc, const_cast<char**>(argv) };
    QLabel *label = new QLabel("Hello Qt!");
    label->show();
    return app.exec();
}

字符串
toolchain.cmake:

set(CMAKE_SYSTEM_NAME Windows)
set(CMAKE_C_COMPILER gcc)
set(CMAKE_CXX_COMPILER g++)


我的configure.bat是这样的:

cmake -G "Ninja" -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake -DCMAKE_BUILD_TYPE=Debug -DCMAKE_VERBOSE_MAKEFILE=ON .


我的CMakeLists.txt是这样的:

cmake_minimum_required(VERSION 3.16)

set(CMAKE_VERBOSE_MAKEFILE on)

project(test_cmake_qt VERSION 0.1.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(Qt6 REQUIRED COMPONENTS Core Widgets)
qt_standard_project_setup()

qt_add_executable(program_qt_gpp_cmake 
    program.cpp
)

target_compile_options(program_qt_gpp_cmake PRIVATE -pedantic -Wall -Wextra -Werror=return-type -Wshadow=local -Wempty-body -fno-ms-extensions -fdiagnostics-color -s -Os -fmax-errors=3)

target_link_libraries(program_qt_gpp_cmake PRIVATE
    Qt6::Widgets
)

set_target_properties(program_qt_gpp_cmake PROPERTIES
    WIN32_EXECUTABLE ON
)


我的build.bat脚本是这样的:

cmake --build . --config Debug --target program_qt_gpp_cmake


所以,我继续如下:

  • configure.bat -> ok
  • build.bat -> error!undefined reference to `qMain(int,char**)'
(...)
4/4] cmd.exe /C "cd . && C:\programs\msys64\ucrt64\bin\g++.exe -g -mwindows CMakeFiles/program_qt_gpp_cmake.dir/program_qt_gpp_cmake_autogen/mocs_compilation.cpp.obj CMakeFiles/program_qt_gpp_cmake.dir/program.cpp.obj -o program_qt_gpp_cmake.exe -Wl,--out-implib,libprogram_qt_gpp_cmake.dll.a -Wl,--major-image-version,0,--minor-image-version,0  C:/programs/msys64/ucrt64/lib/libQt6Widgets.dll.a  C:/programs/msys64/ucrt64/lib/libQt6Gui.dll.a  C:/programs/msys64/ucrt64/lib/libQt6Core.dll.a  -lmpr  -luserenv  -lmingw32  C:/programs/msys64/ucrt64/lib/libQt6EntryPoint.a  -lshell32  -ld3d11  -ldxgi  -ldxguid  -ld3d12  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
FAILED: program_qt_gpp_cmake.exe
cmd.exe /C "cd . && C:\programs\msys64\ucrt64\bin\g++.exe -g -mwindows CMakeFiles/program_qt_gpp_cmake.dir/program_qt_gpp_cmake_autogen/mocs_compilation.cpp.obj CMakeFiles/program_qt_gpp_cmake.dir/program.cpp.obj -o program_qt_gpp_cmake.exe -Wl,--out-implib,libprogram_qt_gpp_cmake.dll.a -Wl,--major-image-version,0,--minor-image-version,0  C:/programs/msys64/ucrt64/lib/libQt6Widgets.dll.a  C:/programs/msys64/ucrt64/lib/libQt6Gui.dll.a  C:/programs/msys64/ucrt64/lib/libQt6Core.dll.a  -lmpr  -luserenv  -lmingw32  C:/programs/msys64/ucrt64/lib/libQt6EntryPoint.a  -lshell32  -ld3d11  -ldxgi  -ldxguid  -ld3d12  -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
C:/programs/msys64/ucrt64/bin/../lib/gcc/x86_64-w64-mingw32/13.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:/programs/msys64/ucrt64/lib/libQt6EntryPoint.a(qtentrypoint_win.cpp.obj):(.text+0x11b): undefined reference to `qMain(int, char**)'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.


为什么我会得到这个错误?qMain定义在哪里,我还应该链接什么(我已经在CMakeLists.txt中使用了Qt 6)?

acruukt9

acruukt91#

问题的根源是Qt的Windows特定入口点库期望main具有签名int main(int, char**)。奇怪的是,当使用msvc编译时,int main()似乎可以工作。(据我所知,qMain只在mingw32构建时进入方程。这可能解释了这种现象。)
一些背景:对于mingw32版本,#define main qMain将通过重命名qMain来“屏蔽”mainqMain被声明为int qMain(int, char **);。因此main必须具有签名int main(int, char**)

相关问题