gcc与cl.exe编译链接Windows窗口程序时应该加的选项

mingw64

直接用类似于gcc hello.c的命令编译/链接一个窗口程序会报错,gcc报错类似于:

undefined reference to `__imp_GetStockObject’

这是因为它默认链接成一个控制台(Console)程序~~(即弹出cmd黑框的程序)~~ ,需要指明链接成窗口程序。

  • gcc命令对应的选项是-mwindws,如:
gcc -mwindows  hello.c 

好像gcc可以自动找到需要的链接库而不用我们去挨个指明(当然前提是所有可能的lib路径添加好了),上面一句简短的命令就直接生成窗口程序了。

  • ld命令对应的选项是--subsystem=windows,例如:
ld subsystem=windows hello.o  XXX链接库 XXX链接库 XXX链接库...

为了用ld链接一个窗口程序具体需要指明很多链接库,具体是哪些懒得去试了。。

MSVC的情况

  • link.exe,对应的选项是/subsystem:windows
    例如,Charles Petzold的《Windows程序设计》的著名示例程序HelloWin,可以这样生成:
cl /c HelloWin.c		#编译,得到HelloWin.obj。/c选项代表只编译不链接
link /subsystem:windows HelloWin.obj user32.lib gdi32.lib Winmm.lib #链接
  • cl.exe有这样个语法:/link [linker options and libraries],所以在使用cl命令是可以加/link /subsystem:windows指明链接成窗口程序。
    例如,一次命令生成上面的HelloWin程序:
cl HelloWin.c /link /subsystem:windows user32.lib gdi32.lib Winmm.lib 

另外:
自己试了试,其实cl和link似乎是不加选项也能自动识别链接模式(吧?)例如可以直接用命令cl HelloWin.c user32.lib gdi32.lib Winmm.lib(我的cl.exe版本是Compiler Version 15.00.21022.08 for 80x86,link.exe版本是 Linker Version 9.00.21022.08,不知道是不是所有版本的MSVC都这样)不过为了确保万无一失还是记录一下。

你可能感兴趣的:(C/C++)