在VC++中使用OpenCV,通常是創建一個 win32 console application 項目,當運行此類程序的時候,默認狀況下會有一個相似DOS窗口的console窗口,供程序與用戶之間交互之用。 windows
可是有時候咱們只想在程序中運行一段功能代碼,不但願顯示這個 console 窗口,而是讓代碼執行完畢以後程序自動退出。隱藏這種 win32 console application 的 console 窗口,主要有兩種方式:架構
一、經過#pragma指令來修改,即在main函數前添加如下一行代碼:
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )app
二、經過設置項目屬性來修改,即在 Project –> Properties -> Configuration Properties –> Linker -> System 的 Subsystem 項中,將 Console (/SUBSYSTEM:CONSOLE) 修改成 Console (/SUBSYSTEM:WINDOWS) ,這樣就把控制檯程序窗口隱去了。函數
上述方法是經過設置編譯器的連接開關來實現的,因此讓咱們來看一下編譯器的連接開關選項(也就是 linker 選項)。spa
1、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 主頁來查看相關內容。io
—— NATIVE:
設備驅動器選項,若是 /DRIVER:WDM 選項被設定的話,該連接選項(NATIVE)就爲默認選項。console
—— 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 中看到!
2、應用程序是如何運行的!
咱們知道用 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)中手工改動!