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

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>
            一区二区日韩欧美| 中文欧美在线视频| 欧美精品自拍偷拍动漫精品| 欧美一区二区高清在线观看| 午夜国产精品视频| 久久黄色网页| 免费观看国产成人| 欧美国产一区视频在线观看| 欧美日本韩国在线| 国产精品久久综合| 狠狠爱成人网| 91久久精品国产91性色tv| 99在线精品观看| 欧美一级午夜免费电影| 久久福利视频导航| 欧美成人午夜剧场免费观看| 亚洲肉体裸体xxxx137| 亚洲国产视频a| 亚洲综合日韩中文字幕v在线| 欧美亚洲综合在线| 美女爽到呻吟久久久久| 亚洲国产日韩综合一区| 亚洲精品日韩一| 亚洲一二三区精品| 久久久久在线| 国产精品a久久久久久| 狠狠入ady亚洲精品| 亚洲精品欧美激情| 久久精品一本| 日韩视频一区二区三区在线播放免费观看| 亚洲一级二级| 欧美激情黄色片| 国产一区二区三区高清| 在线一区日本视频| 欧美国产日韩一区二区三区| 亚洲欧美韩国| 欧美日韩专区在线| 最新成人av在线| 久久久午夜视频| 亚洲在线一区二区| 欧美日本国产在线| 最新69国产成人精品视频免费| 久久国产视频网| 一区二区三区国产在线观看| 欧美激情国产精品| 亚洲国产日韩欧美一区二区三区| 欧美伊人久久久久久久久影院 | 一本色道久久综合精品竹菊| 久久视频国产精品免费视频在线| 欧美日韩激情小视频| 国产精品美女久久久| 亚洲欧洲日本mm| 欧美激情1区2区| 久久aⅴ国产欧美74aaa| 国产精品免费久久久久久| 一二美女精品欧洲| 亚洲精品一二三区| 欧美激情综合五月色丁香| 亚洲黄色性网站| 亚洲国产高清一区| 久久这里只有精品视频首页| 韩日欧美一区| 久久久久久高潮国产精品视| 亚洲欧美一区二区视频| 国产精品一区在线观看你懂的| 亚洲一级黄色av| 亚洲图色在线| 国产欧美精品在线观看| 久久精品日产第一区二区| 欧美在线观看天堂一区二区三区| 国产一区二区三区四区老人| 久久这里有精品15一区二区三区| 久久精品国产免费看久久精品| 精品动漫3d一区二区三区| 免费试看一区| 欧美精品v国产精品v日韩精品| 在线综合亚洲欧美在线视频| 在线亚洲自拍| 一区二区三区毛片| 国产视频久久网| 久久夜色精品国产亚洲aⅴ| 久久久久国产精品午夜一区| 在线播放一区| 亚洲日韩中文字幕在线播放| 国产精品乱人伦中文| 久久精品亚洲一区二区三区浴池| 久久久久国产精品人| 日韩亚洲精品电影| 亚洲免费在线看| 亚洲成人在线视频网站| 日韩一级黄色片| 韩国v欧美v日本v亚洲v| 亚洲人成网站在线观看播放| 国产乱肥老妇国产一区二| 老司机精品视频一区二区三区| 欧美成熟视频| 欧美在线黄色| 欧美风情在线| 久久av一区二区| 欧美激情第8页| 久久久国产成人精品| 欧美区一区二区三区| 久久亚洲春色中文字幕| 欧美午夜免费| 欧美国产在线电影| 国产精品天美传媒入口| 亚洲国产二区| 国模私拍视频一区| 亚洲视频在线观看视频| 亚洲三级免费观看| 欧美主播一区二区三区| 亚洲自拍偷拍福利| 欧美好骚综合网| 女同一区二区| 国产丝袜一区二区| 在线视频日韩| 99国内精品| 另类专区欧美制服同性| 欧美一区二区三区喷汁尤物| 欧美喷水视频| 亚洲国产精品福利| 亚洲国产精品久久久久婷婷老年| 午夜精品久久一牛影视| 亚洲综合精品| 国产精品高精视频免费| 亚洲理论在线| 日韩视频一区二区| 欧美高清在线一区| 亚洲第一网站| 亚洲精品影院| 欧美屁股在线| 99精品久久久| 亚洲影院高清在线| 国产精品国产精品国产专区不蜜| 亚洲毛片在线| 亚洲永久视频| 国产精品亚洲а∨天堂免在线| 一区二区三区四区国产精品| 宅男噜噜噜66国产日韩在线观看| 欧美日本不卡| 亚洲视频高清| 久久成人免费电影| 久久精品国产清高在天天线| 欧美精品大片| 亚洲国产欧美国产综合一区| 亚洲国产影院| 欧美成人综合一区| 日韩一级在线| 欧美影院成年免费版| 国产一区二区看久久| 久久久亚洲人| 亚洲激情一区| 午夜老司机精品| 激情综合自拍| 欧美国产精品v| 在线一区二区三区四区| 久久精品123| 亚洲国产日本| 国产精品久久久久久久久借妻| 亚洲欧美日韩精品一区二区 | 亚洲激情不卡| 欧美日韩一区综合| 午夜在线视频观看日韩17c| 久久久伊人欧美| 亚洲免费观看高清完整版在线观看| 欧美精品在线免费观看| 亚洲一级影院| 欧美激情第8页| 午夜日韩视频| 亚洲国产精品www| 国产精品分类| 免费看亚洲片| 午夜精彩国产免费不卡不顿大片| 免费在线观看一区二区| 亚洲视频免费观看| 一区视频在线播放| 欧美午夜不卡在线观看免费| 久久久久国产精品厨房| 亚洲美女精品成人在线视频| 久久精品免费看| 亚洲一级特黄| 日韩午夜电影av| 伊人成人在线| 国产欧美日韩视频| 欧美少妇一区二区| 久久亚洲不卡| 亚洲欧美中文字幕| 亚洲免费播放| 亚洲国产成人精品视频| 久久国产精品99国产| 一本色道久久综合亚洲精品不| 狠狠做深爱婷婷久久综合一区| 国产精品理论片| 国产精品v欧美精品v日韩| 欧美成人一区二区在线| 欧美在线视频a| 午夜精品久久久久99热蜜桃导演| 一区二区三区**美女毛片| 欧美福利视频一区| 麻豆91精品|