一 一段代码
#if defined(WIN32)
#ifdef NDEBUG
#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#else
#pragma comment(linker, "/SUBSYSTEM:CONSOLE")
#endif
#endif
二 代码解释
1 pragma comment
#pragma comment( comment-type [,"commentstring"] )
comment-type:compiler | exestr | lib | linker | user
2 linker options
(1)/SUBSYSTEM :通知操作系统如何运行 .exe 文件。
/SUBSYSTEM:{BOOT_APPLICATION|CONSOLE|EFI_APPLICATION|
EFI_BOOT_SERVICE_DRIVER|EFI_ROM|EFI_RUNTIME_DRIVER|NATIVE|
POSIX|WINDOWS)
[,major[.minor]]
其中:
CONSOLE
Win32 字符模式应用程序。 操作系统为各种控制台应用程序提供控制台。 如果为本机代码定义了 main 或 wmain,为托管代码定义了 int main(array<String>),或者完全使用 /clr:safe 构建应用程序,则CONSOLE是默认值。
WINDOWS
应用程序不需要控制台,原因很可能是它会创建自己的窗口来与用户进行交互。 如果为本机代码定义了 WinMain 或 wWinMain,或为托管代码定义了 WinMain(HISTANCE *, HINSTANCE *, char *, int) 或 wWinMain(HINSTANCE *, HINSTANCE *, wchar_t *, int),则 WINDOWS 是默认值。
在 Visual Studio 开发环境中设置此链接器选项:
1.打开项目的“属性页” 对话框。
2.选择链接器文件夹。
3.选择系统属性页。
4.修改SubSystem属性。
(2)/ENTRY : 设置起始地址。
/ENTRY:function
function取值:
| 功能名称 | 默认值为 |
|---|---|
| mainCRTStartup (或wmainCRTStartup) | 使用 /subsystem: console; 的应用程序调用main(或wmain)An application that uses /SUBSYSTEM:CONSOLE; calls main (or wmain) |
| WinMainCRTStartup (或wWinMainCRTStartup) | 使用 /SUBSYSTEM 的应用程序:WINDOWS; 调用WinMain(或wWinMain),必须对其进行定义以使用 __stdcallAn application that uses /SUBSYSTEM:WINDOWS; calls WinMain (or wWinMain), which must be defined to use __stdcall |
| _DllMainCRTStartup | DLL;调用DllMain如果存在,其必须进行定义以使用 __stdcall |
在 Visual Studio 开发环境中设置此链接器选项
1.打开项目的“属性页” 对话框。
2.单击链接器文件夹。
3.单击高级属性页。
4.修改入口点属性。
三 参考
本文详细解析了在Win32环境下,C/C++编译器的#pragmacomment指令与链接器选项/SUBSYSTEM和/ENTRY的使用方法。通过这些选项,可以指定应用程序的子系统类型(如CONSOLE或WINDOWS)和入口点函数,适用于不同类型的Windows应用程序。
2660

被折叠的 条评论
为什么被折叠?



