2008年3月24日 星期一

VC++ 連結器設定

若是 /SUBSYSTEM:WINDOWS

代表是選擇 GUI : based on graphic user interface
其 Startup function : (w)WinMainCRTStartup 會呼叫 (w)WinMain(...)
PS: 會去找是否有 WinMain(...), 還是有 wWinMain(...)來決定Startup function

也可以使用 /subsystem:windows /entry:WinMainCRTSartup 來指定要呼叫
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);

或 /subsystem:windows /entry:wWinMainCRTSartup 來指定要呼叫
int wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nCmdShow);

或者只有/subsystem參數時,使用
int _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)這個巨集,
並以_UNICODE或者_MBCS的定義,來決定是WinMain(...)或wWinMain(...)


PS:這裡的定義,是指加在編譯器的設定上,如 /D "_UNICODE" 或/D "_MBCS"

若是 /SUBSYSTEM:CONSOLE

代表是選擇 GUI:based on console user interface
其 Startup function : (w)mainCRTStartup 會呼叫(w)main(...)
PS: 會去找是否有 main(...), 還是有 wmain(...)來決定Startup function

也可以使用 /sybsystem:console /entry:mainCRTSartup 來指定要呼叫int main(int argc, char* argv[] )

或 /sybsystem:console /entry:wmainCRTSartup 來指定要呼叫int wmain(int argc, wchar_t* argv[])

或者只有/subsystem參數時,使用int _tmain(int argc, _TCHAR* argv[])這個巨集,
並以_UNICODE或者_MBCS的定義,來決定是main(...)或wmain(...)


PS:這裡的定義,是指加在編譯器的設定上,如 /D "_UNICODE" 或/D "_MBCS"


#pragma comment( linker, "/subsystem:"windows" /entry:"mainCRTStartup"" )
也可以用這樣的方式寫在程式裡,來設定連結器的參數

一個題目:如何隱藏win32 console application的console視窗 ?
int main(int argc, char* argv[])
{
MessageBox(NULL, "hello", "Notice", MB_OK);
return 0;
}

可以使用#pragma comment( linker, "/subsystem:"windows" /entry:"mainCRTStartup"" )
PS:開發環境的設定/entry 和 /subsystem 必須拿掉

或者在開發環境的
project->setting->link->project option中手工更改

測試結果:
在VC6.0裡,使用pragma的方式,仍然會帶出一個cosole視窗
相關連結:
請問如何隱藏win32 console application的console視窗 ?
http://jackbin.blog.edu.cn/user1/21000/archives/2005/231856.shtml

2008年3月9日 星期日

C++ Builder 靜態函式庫連結

通常使用C++ Builder 編譯產生的程式,都是預設使用動態聯結函式庫的方式(不過不是 .dll 而是 .bpl ),若是把程式放到別台沒裝C++ Builder的電腦上,一定是沒法執行,所以需要在編譯前,將其設定為聯結靜態函式庫,如此只要複製執行檔,就可以在別台電腦(的windwos)上執行了
設定方法如下:
Project->Options...->Linker(tab)->Use dynamic RTL 取消勾選

Project->Options...->Packages(tab)->Build with runtime packages 取消勾選

這樣就可以了
若將Project->Options...->Linker(tab)->Use debug libraries 取消勾選
可以減去一些執行檔的size
這些已經在 C++ Builder 6 驗證過了