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

posts - 319, comments - 22, trackbacks - 0, articles - 11
  C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

1、Run-Time Library

Run-Time Library是編譯器提供的標(biāo)準(zhǔn)庫(kù),提供一些基本的庫(kù)函數(shù)和系統(tǒng)調(diào)用。
我們一般使用的Run-Time Library是C Run-Time Libraries。當(dāng)然也有Standard C++ libraries。 
C Run-Time Libraries實(shí)現(xiàn)ANSI C的標(biāo)準(zhǔn)庫(kù)。VC安裝目錄的CRT目錄有C Run-Time庫(kù)的大部分源代碼。

C Run-Time Libraries有靜態(tài)庫(kù)版本,也有動(dòng)態(tài)鏈接庫(kù)版本;有單線程版本,也有多線程版本;還有調(diào)試和非調(diào)試版本。
可以在"project"-"settings"-"C/C++"-"Code Generation"中選擇Run-Time Library的版本。

動(dòng)態(tài)鏈接庫(kù)版本:
/MD Multithreaded DLL 使用導(dǎo)入庫(kù)MSVCRT.LIB
/MDd Debug Multithreaded DLL 使用導(dǎo)入庫(kù)MSVCRTD.LIB

靜態(tài)庫(kù)版本:
/ML Single-Threaded 使用靜態(tài)庫(kù)LIBC.LIB 
/MLd Debug Single-Threaded 使用靜態(tài)庫(kù)LIBCD.LIB
/MT Multithreaded 使用靜態(tài)庫(kù)LIBCMT.LIB
/MTd Debug Multithreaded 使用靜態(tài)庫(kù)LIBCMTD.LIB

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

2、常見(jiàn)的編譯參數(shù)

VC建立項(xiàng)目時(shí)總會(huì)定義"Win32"??刂婆_(tái)程序會(huì)定義"_CONSOLE",否則會(huì)定義"_WINDOWS"。Debug版定義"_DEBUG",Release版定義"NDEBUG"

 

與MFC DLL有關(guān)的編譯常數(shù)包括:
_WINDLL 表示要做一個(gè)用到MFC的DLL
_USRDLL 表示做一個(gè)用戶DLL(相對(duì)MFC擴(kuò)展DLL而言) 
_AFXDLL 表示使用MFC動(dòng)態(tài)鏈接庫(kù)
_AFXEXT 表示要做一個(gè)MFC擴(kuò)展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產(chǎn)生靜態(tài)庫(kù)。

3、subsystem和可執(zhí)行文件的啟動(dòng)

LINK的時(shí)候需要指定/subsystem,這個(gè)鏈接選項(xiàng)告訴Windows如何運(yùn)行可執(zhí)行文件。
控制臺(tái)程序是/subsystem:"console"
其它程序一般都是/subsystem:"windows "

 

將 subsystem 選成"console"后,Windows在進(jìn)入可執(zhí)行文件的代碼前(如mainCRTStartup),就會(huì)產(chǎn)生一個(gè)控制臺(tái)窗口。
如果選擇"windows",操作系統(tǒng)就不產(chǎn)生console窗口,該類型應(yīng)用程序的窗口由用戶自己創(chuàng)建。

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

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

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

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也會(huì)被埋藏在MFC庫(kù)中(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);
}
對(duì)于ANSI版本,"_tWinMain"就是"WinMain";對(duì)于UINCODE版本,"_tWinMain"就是"wWinMain"??蓞⒁?jiàn)afx.h:

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

全局C++對(duì)象的構(gòu)造函數(shù)是在什么地方調(diào)用的?答案是在進(jìn)入應(yīng)用程序的Entry Point后,在調(diào)用main函數(shù)前的初始化操作中。所以MFC的theApp的構(gòu)造函數(shù)是在_tWinMain之前調(diào)用的。

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

在默認(rèn)情況下/subsystem 和/entry開(kāi)關(guān)是匹配的,也就是:
"console"對(duì)應(yīng)"mainCRTStartup"或者"wmainCRTStartup"
"windows"對(duì)應(yīng)"WinMain"或者"wWinMain"
我們可以通過(guò)手動(dòng)修改的方法使他們不匹配。例如:

 

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

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

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

5、MFC的庫(kù)文件

MFC的庫(kù)可以靜態(tài)鏈接,也可以動(dòng)態(tài)鏈接。靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)又有Debug和Release,ANSI和Unicode版本之分。

 

靜態(tài)MFC庫(kù)主要有:
ANSI Debug NAFXCWD.LIB
ANSI Release NAFXCW.LIB
Unicode Debug UAFXCWD.LIB
Unicode Release UAFXCW.LIB 

動(dòng)態(tài)鏈接庫(kù)主要有;
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以外都是導(dǎo)入庫(kù)。
MFC動(dòng)態(tài)鏈接庫(kù)版本也需要靜態(tài)鏈接一些文件,這些文件就放在MFCSxx(D、U、UD).LIB中。例如包含_tWinMain的appmodul.cpp。

6、結(jié)束語(yǔ)

研究這些問(wèn)題的動(dòng)機(jī)是想弄清楚我們的程序是如何裝載、運(yùn)行的。但是,由于Windows不是開(kāi)源平臺(tái),我也只能研究到PE文件(Windows上可執(zhí)行文件的格式)。entry point、subsystem都是PE文件頭的一部分。

Windows在進(jìn)入PE文件的entry point之前做了些什么,就看不到了,只能大概推測(cè):應(yīng)該是創(chuàng)建一個(gè)進(jìn)程,裝載PE文件和所有需要的DLL,初始化C變量,然后從某個(gè)起點(diǎn)函數(shù)開(kāi)始運(yùn)行。不同的subsystem,應(yīng)該有不同的起點(diǎn)。調(diào)用這個(gè)起點(diǎn)函數(shù)時(shí)應(yīng)該傳入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| 欧美国产免费| 今天的高清视频免费播放成人| 欧美人与禽猛交乱配视频| 欧美中文日韩| 久久aⅴ国产欧美74aaa| 午夜欧美精品久久久久久久| 宅男66日本亚洲欧美视频| 男男成人高潮片免费网站| 亚洲三级网站| 久久精品国产一区二区三区免费看| 亚洲午夜精品久久| 亚洲欧美日韩直播| 久久精品人人做人人综合| 国产伦精品一区二区三区视频黑人 | 亚洲欧美日本在线| 午夜精品美女久久久久av福利| 亚洲欧美日韩一区二区三区在线| 亚洲男女自偷自拍| 亚洲美女一区| 午夜视频精品| 女生裸体视频一区二区三区| 亚洲精品123区| 亚洲新中文字幕| 久久福利毛片| 欧美日本精品| 国内精品**久久毛片app| 黄色日韩精品| 亚洲区中文字幕| 在线视频中文亚洲| 久久久久综合| 亚洲视频在线观看三级| 久久国产日韩| 欧美日韩亚洲系列| 极品尤物av久久免费看| 一个色综合av| 另类人畜视频在线| 国产精品久久久一区二区三区| 麻豆成人精品| 老司机67194精品线观看| 欧美午夜精品久久久| 在线播放视频一区| 亚洲综合精品自拍| 91久久综合亚洲鲁鲁五月天| 久久精品人人| 国产小视频国产精品| 中文av一区二区| 亚洲电影激情视频网站| 久久不射2019中文字幕| 国产精品一区二区三区乱码| 亚洲美女视频在线免费观看| 久久综合一区二区三区| 西西裸体人体做爰大胆久久久| 欧美日韩一区二区视频在线| 亚洲国产日日夜夜| 免费不卡视频| 久久精品一区四区| 国产在线拍偷自揄拍精品| 亚洲国产网站| 欧美亚洲自偷自偷| av不卡在线看| 欧美日韩精品一区二区天天拍小说 | 欧美亚洲免费| 亚洲黄色一区二区三区| 午夜精品99久久免费| 欧美视频久久| 久久国产精品黑丝| 欧美网站在线观看| 亚洲每日更新| 欧美电影在线观看| 性色av一区二区三区在线观看 | 久久免费偷拍视频| 亚洲看片免费| 亚洲国产二区| 免费欧美电影| 伊人久久噜噜噜躁狠狠躁| 欧美一级视频一区二区| 亚洲精品久久久久久下一站 | 亚洲黄色成人久久久| 夜夜嗨av一区二区三区网站四季av| 久久综合色婷婷| 狠狠色狠狠色综合人人| 久久超碰97人人做人人爱| 一卡二卡3卡四卡高清精品视频| 欧美aaa级| 美女久久一区| 久久人人爽国产| 国产日韩精品视频一区| 午夜欧美精品久久久久久久| 亚洲天堂视频在线观看| 国产精品视频久久一区| 亚洲欧美欧美一区二区三区| 9l视频自拍蝌蚪9l视频成人| 国产精品igao视频网网址不卡日韩| 亚洲精品久久嫩草网站秘色| 亚洲福利小视频| 欧美成年人视频网站欧美| 亚洲激情第一区| 亚洲精品九九| 欧美日韩一区在线播放| 亚洲欧美国产77777| 亚洲免费网站| 国内自拍一区| 欧美国产三区| 欧美精品啪啪| 亚洲一级片在线观看| 99精品久久免费看蜜臀剧情介绍| 一本大道久久精品懂色aⅴ | 亚洲片在线观看| 亚洲福利视频一区二区| 欧美日韩亚洲综合| 欧美一二三视频| 久久亚洲综合网| 夜夜爽av福利精品导航| 亚洲自拍偷拍视频| 亚洲高清一二三区| 香港久久久电影| 亚洲欧洲av一区二区| 亚洲电影免费| 一区二区三区欧美视频| 国内精品久久久久久久影视蜜臀| 毛片一区二区三区| 欧美日本国产| 久久人人爽爽爽人久久久| 久久激情一区| 亚洲精品一区二区三区樱花| 亚洲性视频h| 亚洲国产一区二区三区高清| 在线亚洲观看| 亚洲精品国产精品乱码不99按摩 | 亚洲精品中文在线| 韩国av一区二区三区在线观看| 91久久精品美女| 国产专区欧美精品| 一区二区三区精密机械公司| 黄色国产精品| 亚洲色图综合久久| 国产一区二区三区免费不卡| 亚洲人成在线观看一区二区 | 亚洲综合日韩中文字幕v在线| 久久精品国产99国产精品澳门 | 亚洲欧洲精品一区二区三区波多野1战4| 亚洲日本va午夜在线电影| 国产视频精品免费播放| 亚洲精品国精品久久99热一| 在线看片日韩| 久久国产精品电影| 久久精品首页| 国产精品一区二区在线观看网站| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美日韩亚洲天堂| 欧美国产日韩亚洲一区| 精品成人在线观看| 亚洲一区二区免费在线| 一区二区毛片| 欧美国产综合一区二区| 久热精品在线| 国产一区二区三区成人欧美日韩在线观看 | 精品二区久久| 亚洲一二三区在线观看| 国模大胆一区二区三区| 中国女人久久久| 亚洲调教视频在线观看| 欧美日韩国产一区精品一区| 欧美激情免费观看| 亚洲国产精品一区制服丝袜| 久久99伊人| 老司机午夜精品视频| 国内精品视频久久| 久久精品亚洲精品国产欧美kt∨| 久久久精品久久久久| 亚洲在线免费观看| 久久久久国内| 国产综合色一区二区三区| 久久国产视频网| 亚洲高清二区| 久久综合成人精品亚洲另类欧美| 久久一区欧美| 亚洲国产1区| 欧美精品在线网站| 99精品欧美一区| 欧美一区二区在线播放| 国色天香一区二区| 欧美va日韩va| 亚洲欧美日韩国产成人精品影院| 欧美一区二区成人| 韩国女主播一区| 欧美va日韩va| 亚洲天堂免费观看| 美女免费视频一区| 极品少妇一区二区三区| 欧美激情一二三区| 亚洲一区二区三区免费观看| 久久久综合视频| 国产一区二区中文字幕免费看| 亚洲一区二区三区成人在线视频精品 | 一本色道久久综合精品竹菊| 欧美性天天影院| 国产一区二区三区久久悠悠色av | 国产精品一区二区a|