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

Gui*_*oie 4 c++ winapi cmake clion visual-studio-2015

我无法使用 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
Run Code Online (Sandbox Code Playgroud)

以下是重现该问题的代码的最简化版本。它包含在这两个文件中:

有关我正在使用的工具的更多详细信息:

  • CLION 2018.1 EAP(最新版本)
    • 我还用以前的非 EAP 版本进行了测试,结果相同
    • CLion 的工具链架构设置为 x86_amd64
    • CLion 的 CMake 构建类型设置为 Debug
  • CMake 3.9.6
  • Visual Studio 2015(社区)

请指教

编辑 1

正如我所提到的,我尽可能地简化了代码以重现错误。因此,使用 std::out。真正的应用程序实际上是一个 QT 应用程序,而不是一个控制台应用程序。

我在 CMakeList.txt 文件中添加了 WIN32 参数,以便应用程序在执行 EXE 时直接启动 GUI(而不是加载命令行提示符然后加载 GUI)。

IIn*_*ble 5

错误是可以预料的。它只是遵循该行的记录行为

add_executable(${PROJECT_NAME} WIN32 main.cpp)
Run Code Online (Sandbox Code Playgroud)

add_executable

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

WIN32_EXECUTABLE的文档:

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

您有 2 个选择:

  • WIN32add_executable命令中删除。
  • 替换int main(int, char**)WinMain入口点:int CALLBACK WinMain(HINSTANCE, HINSTANCE, LPSTR, int).

如果您不希望弹出控制台窗口,则第二个选项可能就是您要查找的内容。