imgui例程cmake化遇到的一个bug

项目场景:

提示:这里简述项目相关背景:

在我想将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参数就不会显示控制台界面了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值