搜档网
当前位置:搜档网 › Opencv隐藏Console窗口

Opencv隐藏Console窗口

晨宇思远的C博客

OpenCV学习笔记(2)隐藏Console 窗口

在VC++中使用OpenCV,一般是建立一个win32 console application 项目,当运行此类程序的时候,默认情况下会有一个类似DOS窗口的console窗口,供程序与用户之间交互之用。

但是有时候我们只想在程序中运行一段功能代码,不希望显示这个console 窗口,而是让代码执行完毕之后程序自动退出。隐藏这种win32 console application 的console 窗口,主要有两种方式:

1、通过#pragma指令来修改,即在main函数前添加以下一行代码:

正确的#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )错误的#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) 2、通过设置项目属性来修改,即在Project –> Properties -> Configuration Properties –> Linker -> System 的Subsystem 项中,将Console (/SUBSYSTEM:CONSOLE) 修改为Console (/SUBSYSTEM:WINDOWS) ,这样就把控制台程序窗口隐去了。

上述方法是通过设置编译器的链接开关来实现的,所以让我们来看一下编译器的链接开关选项(也就是linker 选项)。

一、linker 的/subsystem 选项:

该选项的语法形式如下:

/SUBSYSTEM:{CONSOLE | EFI_APPLICATION | EFI_BOOT_SERVICE_DRIVER |

EFI_ROM | EFI_RUNTIME_DRIVER | NATIVE | POSIX | WINDOWS | WINDOWSCE}

[,major[.minor]]

这个链接选项告诉操作系统如何运行可执行文件。

—— CONSOLE:

win32 字符模式应用程序,此种类型的应用程序在运行的时候会产生一个类似DOS窗口的控制台窗口。如果在应用程序的主函数为main() 或者wmain(),在默认情况下该应用程序就是一个控制台应用程序。

—— Extensible Firmware Interface (EFI_***):

这4种EFI_*** 是和CPU具体架构相关的参数选项,并不常用,有兴趣的可以访问intel 主页来查看相关内容。

—— NATIVE:

设备驱动器选项,如果/DRIVER:WDM 选项被设定的话,该链接选项(NATIVE)就为默认选项。

—— POSIX:

在windows NT 种运行在POSIX子系统上的应用程序。

—— WINDOWS:

该类型的应用程序不产生console窗口,程序窗口由用户自己创建,简而言之就是一个标准的Win32 application,其入口地址为WinMain()函数或者wWinMain()函数的地址。如果你在应用程序中定义的主函数为WinMain 或者wWinMain,在默认情况下该应用程序就是一个Win32 Application !

—— WINDOWSCE:

运行在windows CE 上的应用程序。

—— major and minor (optional):

主版本号和次版本号,该选项为可选,该选项为0~65535之间的十进制整数。

从上面可以看出,如果我们建立一个win32 console application 的话,linker 的

/subsystem 选项应该为CONSOLE,可以在VC6 开发环境的

project->setting->link->project option 或者VS2005/2008 开发环境的Project –> Properties -> Configuration Properties –> Linker -> System 中看到!

二、应用程序是如何运行的!

我们知道用VC 编写的程序,运行的时候是需要C/C++ 运行库支持的。当我们运行一个C/C++ 程序的时候,链接器会首先寻找应用程序的启动函数,例如:

如果你建立了一个console 程序的话,编译器的链接开关会是以下这种形式:

/subsystem:"console" /entry:"mainCRTStartup" (ANSI)

/subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE)

如果你建立了一个win32 application,编译器的链接开关则会是以下形式:

/subsystem:"windows" /entry:"WinMain" (ANSI)

/sbusystem:"windows" /entry:"wWinMain" (UINCODE)

上面的两种形式可以在Project –> Properties -> Configuration Properties –> Linker -> System (VS2005/08)中看到,其中的subsystem 和entry 并不需要都设置,如果你只设置了/subsystem:"console" 的话,那么默认的entry 开关应为

/entry:"mainCRTStartup";反之,如果你在应用程序中定义了main 函数的话,默认情况下,你的/subsystem 开关应该为/system:"console"。

在默认情况下,/subsystem 和/entry 开关是匹配的,也就是console 对应mainCRTStartup 或者wmainCRTStartup;windows 对应WinMain 或者wWinMain。

但是我们也可以通过手动改动的方式使他们不匹配,例如我们可以这样改动:

#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) // 设置入口地址

int main(int argc, char* argv[])

{

MessageBox(NULL, "hello", "Notice", MB_OK);

return 0;

}

在默认情况下,链接器看到/subsystem 下是windows 选项的时候,它会自动寻找WinMain 或者wWinMain,

但我们强制指定入口地址,这样运行程序的时候默认的console窗口就会隐藏!

上面是在代码中使用#pragma 指令来设置,还有一种就是直接在开发环境的Project –>

Properties -> Configuration Properties –> Linker -> System (VS2005/08)中手工改动!更多2

?上一篇OpenCV 学习笔记(1)安装设置、显示图像

?下一篇OpenCV学习笔记(3)用VS2008编译OpenCV2.0源代码(编译错误已解决)

主题推荐

opencv操作系统编译器控制台windows ce

全程详解 VS2010+PCL配置

C#图片处理之:Gamma校正

3*3高斯,BOX,拉普拉斯滤波的实现

Windows管道(Pipe)重定向stdout,stderr,stdin

空间滤波(四) sobel 算子

RAW格式图像转为BMP格式

ubuntu上面编译并使用OpenCV

python 网络编程 TCP套接字实例

贝叶斯网络(一)

纹理特征提取及LBP纹理特征matlab实现

查看评论

9楼紫荆飘香V 2013-12-17 23:16发表[回复]

不错。。

8楼g_idea 2013-04-02 14:01发表[回复]

[cpp]view plaincopy

1.#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTSt

artup\"" )

Re: long163 2013-12-17 18:18发表[回复]

回复g_idea:8楼正解给力!

Re: 守候小木屋 2014-02-21 10:20发表[回复]

回复long163:解决啦,8楼威武

Re: wmmwmm0420 2013-08-12 20:59发表[回复]

回复g_idea:8楼威武~

7楼lover_mei 2011-10-27 13:58发表[回复]

#pragma comment( linker, "/subsystem:/"windows/" /entry:/"mainCRTStartup/"" ) 加了这句但是运行还是有类似dos命令行窗口

Re: ms_yogurt 2012-02-16 21:14发表[回复]

回复lover_mei:我也是

Re: wmmwmm0420 2013-08-12 20:57发表[回复]

回复ms_yogurt:我也是。。

6楼lover_mei 2011-10-27 13:52发表[回复]

int main(int argc, char* argv[])

{

MessageBox(NULL, "hello", "Notice", MB_OK);

return 0;

}

"hello", "Notice", 这两个参数导致的问题

error C2664: ―MessageBoxW‖: 不能将参数2 从―const char [6]‖转换为―LPCWSTR‖

请楼主问这样的错误是什么原因呀?

Re: 邹宇华 2011-11-01 17:12发表[回复]

回复lover_mei:你试试强制类型转换或者在用_T(" *** ") 的方式

5楼shanleo1986 2009-12-01 09:23发表[回复]

你好,我用的是vc 6.0,请问该怎么设置啊?加上

#pragma comment( linker, "/subsystem:/"windows/"

/entry:/"mainCRTStartup/"" )

之后不能通过编译

4楼xauatnwpu 2009-11-16 19:50发表[回复]

hi, ur introduction is very good.

3楼ningjing119 2009-10-27 13:11发表[回复]

"将Console (/SUBSYSTEM:CONSOLE) 修改为Console

(/SUBSYSTEM:WINDOWS)",但是默认选项是''WINDOWS

(/SUBSYSTEM:WINDOWS)",选用后出现2楼说的情况;手动修改成"Console

(/SUBSYSTEM:WINDOWS)"系统不认

Re: 邹宇华 2009-10-27 16:17发表[回复]

如果默认是''WINDOWS (/SUBSYSTEM:WINDOWS)",可能是你建立的不是Win32 Console 项目哦。

Re: wmmwmm0420 2013-08-12 21:01发表[回复]

回复chenyusiyuan:遇到同样的问题

2楼ytycn 2009-10-13 14:17发表[回复][引用][举报]

你好/请问为何我在vs2008中不能像你说的设置呢

1>------ Build started: Project: Hello, Configuration: Debug Win32 ------

1>Compiling...

1>Hello.cpp

1>d:/opencv2.0/include/opencv/cvcompat.h(803) : warning C4819: The file contains a

character that cannot be represented in the current code page (936). Save the file in Unicode

format to prevent data loss

1>Linking...

1>MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup

1>C:/我的文档/Visual Studio 2008/Projects/openCV/Hello/Debug/Hello.exe : fatal error LNK1120: 1 unresolved externals

Re: 邹宇华 2009-10-13 21:59发表[回复][引用][举报]

可能你的main函数是这样写了:

int _tmain(int argc, _Tchar* argv)

但编译时这个_tmain 就是一个无法定位的外部符号,可以改为这样试试:

int main(int argc, char** argv)

Re: ms_yogurt 2012-02-16 21:17发表[回复]

回复chenyusiyuan:我改成那种形式了编译的时候还是产生了好多错误为什么呢

相关主题