青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

在VC中編譯、運行程序的小知識點

Posted on 2011-05-12 22:06 RTY 閱讀(538) 評論(0)  編輯 收藏 引用 所屬分類: 編程常識C/C++轉載隨筆

1、Run-Time Library

Run-Time Library是編譯器提供的標準庫,提供一些基本的庫函數和系統調用。
我們一般使用的Run-Time Library是C Run-Time Libraries。當然也有Standard C++ libraries。 
C Run-Time Libraries實現ANSI C的標準庫。VC安裝目錄的CRT目錄有C Run-Time庫的大部分源代碼。

C Run-Time Libraries有靜態庫版本,也有動態鏈接庫版本;有單線程版本,也有多線程版本;還有調試和非調試版本。
可以在"project"-"settings"-"C/C++"-"Code Generation"中選擇Run-Time Library的版本。

動態鏈接庫版本:
/MD Multithreaded DLL 使用導入庫MSVCRT.LIB
/MDd Debug Multithreaded DLL 使用導入庫MSVCRTD.LIB

靜態庫版本:
/ML Single-Threaded 使用靜態庫LIBC.LIB 
/MLd Debug Single-Threaded 使用靜態庫LIBCD.LIB
/MT Multithreaded 使用靜態庫LIBCMT.LIB
/MTd Debug Multithreaded 使用靜態庫LIBCMTD.LIB

C Run-Time Library的標準io部分與操作系統的關系很密切,在Windows上,CRT的io部分代碼只是一個包裝,底層要用到操作系統內核kernel32.dll中的函數,在編譯時使用導入庫kernel32.lib。這也就是為什么在嵌入式環境中,我們一般不能直接使用C標準庫。
在Linux環境當然也有C標準庫,例如:
ld -o output /lib/crt0.o hello.o -lc
參數"-lc"就是在引用C標準庫libc.a。猜一猜"-lm"引用哪個庫文件?

2、常見的編譯參數

VC建立項目時總會定義"Win32"。控制臺程序會定義"_CONSOLE",否則會定義"_WINDOWS"。Debug版定義"_DEBUG",Release版定義"NDEBUG"

 

與MFC DLL有關的編譯常數包括:
_WINDLL 表示要做一個用到MFC的DLL
_USRDLL 表示做一個用戶DLL(相對MFC擴展DLL而言) 
_AFXDLL 表示使用MFC動態鏈接庫
_AFXEXT 表示要做一個MFC擴展DLL
所以:
Regular, statically linked to MFC _WINDLL,_USRDLL 
Regular, using the shared MFC DLL _WINDLL,_USRDLL,_AFXDLL
Extension DLL _WINDLL,_AFXDLL,_AFXEXT

CL.EXE編譯所有源文件,LINK.EXE鏈接EXE和DLL,LIB.EXE產生靜態庫。

3、subsystem和可執行文件的啟動

LINK的時候需要指定/subsystem,這個鏈接選項告訴Windows如何運行可執行文件。
控制臺程序是/subsystem:"console"
其它程序一般都是/subsystem:"windows "

 

將 subsystem 選成"console"后,Windows在進入可執行文件的代碼前(如mainCRTStartup),就會產生一個控制臺窗口。
如果選擇"windows",操作系統就不產生console窗口,該類型應用程序的窗口由用戶自己創建。

可執行文件都有一個Entry Point,LINK時可以用/entry指定。缺省情況下,如果subsystem是“console”,Entry Point是 mainCRTStartup(ANSI)或wmainCRTStartuup(UNICODE),即:
/subsystem:"console" /entry:"mainCRTStartup" (ANSI)
/subsystem:"console" /entry:"wmainCRTStartuup" (UNICODE)
mainCRTStartup 或 wmainCRTStartuup 會調用main或wmain。
值得一提的是,在進入應用程序的Entry Point前,Windows的裝載器已經做過C變量的初始化,有初值的全局變量擁有了它們的初值,沒有初值的變量被設為0。

如果subsystem是“windows”,Entry Point是WinMain(ANSI)或wWinMain(UINCODE),即:
/subsystem:"windows" /entry:"WinMainCRTStartup" (ANSI)
/sbusystem:"windows" /entry:"wWinMainCRTStartup" (UINCODE)
WinMainCRTStartup 或 wWinMainCRTStartup 會調用 WinMain 或 wWinMain。

這些入口點函數,在CRT目錄都可以看到源代碼,例如(為了簡潔,我刪除了原代碼的一些條件編譯):

void mainCRTStartup(void)
{
        int mainret;

        /* Get the full Win32 version */
        _osver = GetVersion();
        _winminor = (_osver >> 8) & 0x00FF ;
        _winmajor = _osver & 0x00FF ;
        _winver = (_winmajor << 8) + _winminor;
        _osver = (_osver >> 16) & 0x00FFFF ;

#ifdef _MT
        if ( !_heap_init(1) )               /* initialize heap */
#else  /* _MT */
        if ( !_heap_init(0) )               /* initialize heap */
#endif  /* _MT */
            fast_error_exit(_RT_HEAPINIT);  /* write message and die */

#ifdef _MT
        if( !_mtinit() )                    /* initialize multi-thread */
            fast_error_exit(_RT_THREAD);    /* write message and die */
#endif  /* _MT */

        __try {
            _ioinit();                      /* initialize lowio */
            _acmdln = (char *)GetCommandLineA();        /* get cmd line info */
            _aenvptr = (char *)__crtGetEnvironmentStringsA();        /* get environ info */
            _setargv();
            _setenvp();
            __initenv = _environ;
            mainret = main(__argc, __argv, _environ);
            exit(mainret);
        }
        __except ( _XcptFilter(GetExceptionCode(), GetExceptionInformation()) )
        {
            _exit( GetExceptionCode() );        /* Should never reach here */
        } /* end of try - except */
}  

如果使用MFC框架,WinMain也會被埋藏在MFC庫中(APPMODUL.CPP):
extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPTSTR lpCmdLine, int nCmdShow)
{
// call shared/exported WinMain
return AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}
對于ANSI版本,"_tWinMain"就是"WinMain";對于UINCODE版本,"_tWinMain"就是"wWinMain"。可參見afx.h:

#ifdef _UNICODE
#define _tmain wmain
#define _tWinMain wWinMain
#else
#define _tmain main
#define _tWinMain WinMain
#endif

全局C++對象的構造函數是在什么地方調用的?答案是在進入應用程序的Entry Point后,在調用main函數前的初始化操作中。所以MFC的theApp的構造函數是在_tWinMain之前調用的。

4、不顯示Console窗口的Console程序

在默認情況下/subsystem 和/entry開關是匹配的,也就是:
"console"對應"mainCRTStartup"或者"wmainCRTStartup"
"windows"對應"WinMain"或者"wWinMain"
我們可以通過手動修改的方法使他們不匹配。例如:

 

#include "windows.h"
#pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" ) // 設置入口地址 
void main(void)
{
MessageBox(NULL, "hello", "Notice", MB_OK);
}

這個Console程序就不會顯示Console窗口。如果選/MLd的話,這個程序只需要鏈接LIBCD.LIB user32.lib kernel32.lib。

其實如果不想看到Console窗口,還有一個更直接的方法:那就是直接在EXE文件中將PE文件頭的Subsystem從3改成2。在EXE文件中,PE文件頭的偏移地址是0x3c,Subsystem是一個WORD,它在PE文件頭中的偏移是0x5c。

5、MFC的庫文件

MFC的庫可以靜態鏈接,也可以動態鏈接。靜態庫和動態庫又有Debug和Release,ANSI和Unicode版本之分。

 

靜態MFC庫主要有:
ANSI Debug NAFXCWD.LIB
ANSI Release NAFXCW.LIB
Unicode Debug UAFXCWD.LIB
Unicode Release UAFXCW.LIB 

動態鏈接庫主要有;
ANSI Debug MFCxxD.LIB (core,MFCxxD.DLL), 
MFCOxxD.LIB (OLE,MFCOxxD.DLL), 
MFCDxxD.LIB (database,MFCDxxD.DLL), 
MFCNxxD.LIB (network,MFCNxxD.DLL), 
MFCSxxD.LIB (static)

ANSI Release MFCxx.LIB (combined,MFCxx.DLL)
MFCSxx.LIB (static)

Unicode Debug MFCxxUD.LIB (core,MFCxxUD.DLL), 
MFCOxxUD.LIB (OLE,MFCOxxUD.DLL), 
MFCDxxUD.LIB (database,MFCDxxUD.DLL), 
MFCNxxUD.LIB (network,MFCNxxUD.DLL), 
MFCSxxUD.LIB (static)

Unicode Release MFCxxU.DLL (combined,MFCxxU.DLL), 
MFCSxxU.LIB (static)

上面的LIB文件除了MFCSxx(D、U、UD).LIB以外都是導入庫。
MFC動態鏈接庫版本也需要靜態鏈接一些文件,這些文件就放在MFCSxx(D、U、UD).LIB中。例如包含_tWinMain的appmodul.cpp。

6、結束語

研究這些問題的動機是想弄清楚我們的程序是如何裝載、運行的。但是,由于Windows不是開源平臺,我也只能研究到PE文件(Windows上可執行文件的格式)。entry point、subsystem都是PE文件頭的一部分。

Windows在進入PE文件的entry point之前做了些什么,就看不到了,只能大概推測:應該是創建一個進程,裝載PE文件和所有需要的DLL,初始化C變量,然后從某個起點函數開始運行。不同的subsystem,應該有不同的起點。調用這個起點函數時應該傳入PE文件的entry point地址。

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲人成人一区二区在线观看 | 免费久久精品视频| 国产精品伊人日日| 久久久女女女女999久久| 亚洲电影在线看| 在线看片欧美| 欧美在线不卡视频| 欧美一级免费视频| 欧美在线播放一区| 欧美一区午夜精品| 美女精品自拍一二三四| 欧美激情第9页| 欧美日韩精品| 国产视频一区在线观看一区免费 | 国产精品久久久久久五月尺| 国产农村妇女毛片精品久久莱园子| 久久久xxx| 久久人人爽国产| 免费在线观看成人av| 欧美日韩国产精品一卡| 亚洲宅男天堂在线观看无病毒| 亚洲在线播放| 免费不卡中文字幕视频| 欧美激情综合色| 国产精品欧美经典| 国内精品伊人久久久久av影院| 99综合在线| 久久久久九九视频| 欧美另类视频在线| 国外成人免费视频| 91久久精品国产91久久性色| 亚洲欧美视频一区| 久久久久九九九| 亚洲福利视频网站| 一区二区三区久久网| 欧美一区二区三区成人| 另类亚洲自拍| 欧美在线视频免费观看| 欧美在线视频观看免费网站| 欧美三级网址| 一区免费观看| 亚洲一区欧美激情| 久久综合伊人77777麻豆| 亚洲国产精品成人综合| 亚洲午夜激情网站| 亚洲国产精品久久久久婷婷老年| 在线观看视频一区二区| 黄色成人av网| 99精品99久久久久久宅男| 亚洲一区二区黄色| 亚洲欧美国产精品va在线观看| 久久久久亚洲综合| 日韩午夜在线电影| 久久久人成影片一区二区三区 | 亚洲人成高清| 欧美一二三区精品| 欧美日韩三级电影在线| 国产精品美女久久久久久免费| 在线观看视频一区| 亚洲综合色丁香婷婷六月图片| 亚洲午夜伦理| 亚洲电影av在线| 久久精品女人| 国产伦精品一区二区三区免费 | 美女日韩欧美| 久久乐国产精品| 国产欧美日韩| 久久精品一二三区| 亚洲一区三区在线观看| 国产女主播一区| 亚洲一级高清| 午夜精品免费视频| 国产精品美女久久| 久久久久久黄| 欧美专区第一页| 亚洲三级免费| 欧美激情日韩| 国产精品久久毛片a| 一区二区成人精品| 亚洲清纯自拍| 欧美久久久久| 日韩一级精品| 91久久精品视频| 久久激情五月激情| 国产精品爽爽ⅴa在线观看| 亚洲天堂久久| 亚洲国产女人aaa毛片在线| 亚洲欧美日本国产有色| 国产精品影音先锋| 久久精品亚洲国产奇米99| 亚洲精品一区二区三区蜜桃久| 欧美性开放视频| 亚洲欧美日韩精品久久亚洲区| 亚洲麻豆av| 欧美性做爰猛烈叫床潮| 午夜精品久久久久久久白皮肤| 亚洲视频欧美视频| 亚洲一区不卡| 亚洲一区二区毛片| 性欧美xxxx视频在线观看| 欧美高清在线一区二区| 亚洲人成在线观看| 亚洲精品色图| 国产精品免费一区二区三区在线观看 | 久久精品盗摄| 亚洲一区二区三区精品在线观看| 国产精品久久久久秋霞鲁丝| 99国产精品| 亚洲欧美日韩电影| 久热精品视频在线观看一区| 欧美mv日韩mv国产网站app| 欧美激情一区二区在线| 午夜精品成人在线| 亚洲激情国产精品| 亚洲国产人成综合网站| 久久最新视频| 欧美日韩国产在线一区| 久久av二区| 欧美日本精品在线| 亚洲欧美国产77777| 欧美日韩国产区一| 99热免费精品| 欧美在线精品一区| 中文久久精品| 久久国内精品自在自线400部| 亚洲免费高清| 久久精品99国产精品| 一区在线免费观看| 欧美在线资源| 亚洲一区二区三区乱码aⅴ| 久久香蕉国产线看观看网| 亚洲午夜av在线| 亚洲欧美成aⅴ人在线观看| 亚洲在线免费视频| 欧美成人免费观看| 久久影院亚洲| 国产精品久久久久影院色老大| 亚洲精品日本| 欧美日韩国产综合新一区| 嫩草影视亚洲| 国产亚洲精品aa| 亚洲午夜女主播在线直播| 亚洲开发第一视频在线播放| 久久精品亚洲精品| 性色一区二区| 久热国产精品| 欧美一级视频| 性做久久久久久久免费看| 欧美精品一区二区三区在线播放| 亚洲综合日本| 欧美日韩一区在线播放| 亚洲经典一区| 日韩视频第一页| 亚洲精品国产系列| 亚洲国产成人一区| 久久久夜夜夜| 免播放器亚洲一区| 久久久美女艺术照精彩视频福利播放| 欧美电影免费观看高清完整版| 欧美区国产区| 欧美刺激性大交免费视频| 99在线视频精品| 国产精品va在线播放| 国产精品日韩欧美一区二区| 欧美天天综合网| 亚洲一区视频在线观看视频| 亚洲国产精品一区二区第四页av | 一区二区三区精品| 免费观看30秒视频久久| 国产精品久久久久久亚洲调教| 国产亚洲欧美aaaa| 亚洲精品一区二区三区99| 欧美日韩亚洲不卡| 亚洲欧美区自拍先锋| 欧美影院成人| 国产精品一区久久| 久久久夜精品| 亚洲人成艺术| 欧美大学生性色视频| 久久亚洲不卡| 国产精品久久二区二区| 蜜桃伊人久久| 欧美亚洲免费| 亚洲女人天堂成人av在线| 亚洲一区二区在线视频| 欧美不卡一区| 狠狠久久婷婷| 亚洲欧美日韩综合aⅴ视频| 美女脱光内衣内裤视频久久影院 | 国产精品亚洲人在线观看| 亚洲电影免费在线| 99视频精品全部免费在线| 国产精品久久久久久模特| 久久大香伊蕉在人线观看热2| 免费观看成人www动漫视频| 亚洲剧情一区二区| 欧美极品一区| 在线成人免费观看| 久久久久久久久久久一区| 99国内精品久久久久久久软件|