C++ 使用CLion/CMake/MSVC 2015编译WIN32应用程序时出现链接错误

C++ 使用CLion/CMake/MSVC 2015编译WIN32应用程序时出现链接错误,c++,winapi,visual-studio-2015,cmake,clion,C++,Winapi,Visual Studio 2015,Cmake,Clion,我无法使用CLion和Visual Studio 2015作为工具链来编译简单的WIN32应用程序。以下是我得到的链接器错误: [ 50%] Linking CXX executable test-test.exe MSVCRTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function "int __cdecl invoke_main(void)" (?invo

我无法使用CLion和Visual Studio 2015作为工具链来编译简单的WIN32应用程序。以下是我得到的链接器错误:

[ 50%] Linking CXX executable test-test.exe
MSVCRTD.lib(exe_winmain.obj) : error LNK2019: unresolved external symbol WinMain referenced in function "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ)
test-test.exe : fatal error LNK1120: 1 unresolved externals
LINK Pass 1 failed. with 1120
下面是重现该问题的代码的最简化版本。它包含在以下两个文件中:

  • CMakeList.txt

    cmake_minimum_required(VERSION 3.9.6)
    add_executable(${PROJECT_NAME} WIN32 main.cpp)
    
  • main.cpp

    #include <iostream>
    
    int main(int argc, char **argv) {
        std::cout << "HELLO WORLD!" << std::endl;
        return 0;
    }
    
    #包括
    int main(int argc,字符**argv){
    
    std::cout错误是意料之中的。它只是遵循记录在案的行行为

    add_executable(${PROJECT_NAME} WIN32 main.cpp)
    
    发件人:

    如果给定了WIN32
    ,则将在创建的目标上设置属性。有关详细信息,请参阅该目标属性的文档

    文件包括:

    […]当此属性设置为true时,在Windows上链接的可执行文件将使用WinMain()入口点而不是main()。[…]

    您有两种选择:

    • add_executable
      命令中删除
      WIN32
    • intmain(int,char**)
      替换为入口点:
      intcallbackwinmain(HINSTANCE,HINSTANCE,LPSTR,int)
    如果您不希望控制台窗口弹出,那么第二个选项很可能就是您要找的内容。

    已经很好地介绍了这一点,但我有一个小的补充

    因为您编写了一个Qt应用程序:用于以可移植的方式处理此问题

    Qt附带一个静态库
    qtmain.lib
    ,它为您定义了一个
    WinMain()
    函数,该函数只需将所有命令行参数转发给
    main
    函数(对于Win32可执行文件,该函数只是一个普通函数)。对于Qt5,您只需将以下内容添加到
    CMakeLists.txt

    if(WIN32)
        target_link_libraries(${PROJECT_NAME} PUBLIC Qt5::WinMain)
    endif()
    

    请注意,只有在先前的
    find_package
    调用已正确找到Qt5的情况下,此操作才会起作用。

    会丢失cmake文件中的WIN32条目。此外,为什么要将CLion与VS一起使用?为什么不只使用VS?您必须定义
    WinMain
    而不是
    main
    ,这对于
    控制台来说很方便。“这是我得到的编译错误”-不,这不是你得到的编译器错误,“错误LNK2019:。。。"是一个链接错误。不同的是,编译器在这里没有代码的问题,但是链接器确实。@ RunDROP—不,你不需要为控制台应用程序定义WiMeA.@ NeilButterworth我用Java、PHP和C++开发。JeTeNejava为井手三种语言提供了IDE特征一致性。另外,我不是视觉支柱的大粉丝。io作为IDE。感谢您的洞察力。添加到Qt5::WinMain的链接修复了我的问题我的QT应用程序。