项目场景:
提示:这里简述项目相关背景:
在我想将imgui的sln项目中的example_glfw_opengl3,改造成vscode+cmake项目时,遇到了一个奇怪bug。
问题描述
提示:这里描述项目中遇到的问题:
[build] LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
[build] MSVCRTD.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 WinMain,函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中引用了该符号
起初,我以为是vs里属性栏里设置的那个要屏蔽MSVCRT.lib,要在cmakelists里写上:
# 使用CMAKE_EXE_LINKER_FLAGS全局设置
set(CMAKE_EXE_LINKER_FLAGS ${CMAKE_EXE_LINKER_FLAGS} "/NODEFAULTLIB:msvcrt.lib")
但我写上后,又发现了新的错误:
[build] LINK : warning LNK4012: 值“x64;/NODEFAULTLIB:msvcrt.lib”无效,必须是“ARM, ARM64, ARM64X, EBC, X64, or X86”;已忽略选项
[build] LINK : warning LNK4098: 默认库“MSVCRT”与其他库的使用冲突;请使用 /NODEFAULTLIB:library
[build] MSVCRTD.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 WinMain,函数 "int __cdecl invoke_main(void)" (?invoke_main@@YAHXZ) 中引用了该符号
原因分析:
提示:这里填写问题的分析:
我将关注的重点,放在了将vs的屏蔽某些库给改成cmake语句上了,而这个warning LNK4012更是连mircro上都没有!!! 把我都急哭了。
但后来,我发现自己的关注点好像错了,warning LNK4012和warning LNK4098其实也都仅仅是warning啊,LNK2019才是error啊,但我还是毫无头绪啊。
解决方案:
提示:这里填写该问题的具体解决方案:
万般无奈之下,我试了一下,把main.cpp里的Main函数改成了,WinMain()
// Main code
int WinMain(int, char**)
{
结果居然编译通过了!!!然后我就赶紧查了一下,main和winmain的区别。原来,main是控制台程序的入口,winmain是win32程序的入口,而imgui是有界面的,所以要用winmain。这个问题真是太奇葩了!
另外,cmake里的生成exe里,也要加上一WIN32,否则也会报错,原因未知。
add_executable(${PROJECT_NAME} WIN32 src/main.cpp ${IMGUI_SOURCES} ${BACKENDS_SOURCES}) #添加WIN32参数就不会显示控制台界面了