如何用Cython --embed编译无控制台窗口的Python3.8可执行文件?
Cython编译无控制台窗口的Windows可执行文件
有一个关联问题针对Python2.7和MinGW环境,但对应的方案无法直接适用于Python3.8+搭配MSVC的场景。
目前可通过以下命令用Cython生成带控制台窗口的.exe文件:
cython test.py --embed call vcvarsall.bat x64 cl test.c /I C:\Python38\include /link C:\Python38\libs\python38.lib
执行后生成的test.exe启动时会弹出终端控制台窗口。
问题:如何通过cython --embed编译生成无控制台窗口的可执行文件?
尝试添加/subsystem:window参数编译:
cl test.c /I C:\Python38\include /link C:\Python38\libs\python38.lib /subsystem:window
但编译失败,报错:
LIBCMT.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 WinMain,该符号在函数 "int __cdecl __scrt_common_main_seh(void)" (?__scrt_common_main_seh@@YAHXZ) 中被引用
解决方案
指定/subsystem:window时,MSVC会默认寻找WinMain作为程序入口,但Cython的--embed选项默认生成的是main函数作为入口,因此出现链接错误。可通过两种方式解决:
方法1:显式指定入口点
在链接阶段添加/ENTRY:mainCRTStartup参数,告知编译器使用标准main入口,同时启用窗口子系统:
cl test.c /I C:\Python38\include /link C:\Python38\libs\python38.lib /subsystem:windows /ENTRY:mainCRTStartup
方法2:修改Cython生成的C代码
打开生成的test.c文件,找到main函数,将其重命名为WinMain并调整为Windows标准签名:
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // 保留原main函数内的所有代码 return Py_Main(__argc, __argv); }
修改完成后,再用带/subsystem:window的命令编译即可。
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

