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

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

1、Run-Time Library

Run-Time Library是編譯器提供的標(biāo)準(zhǔn)庫,提供一些基本的庫函數(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)庫。VC安裝目錄的CRT目錄有C Run-Time庫的大部分源代碼。

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

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

靜態(tài)庫版本:
/ML Single-Threaded 使用靜態(tài)庫LIBC.LIB 
/MLd Debug Single-Threaded 使用靜態(tài)庫LIBCD.LIB
/MT Multithreaded 使用靜態(tài)庫LIBCMT.LIB
/MTd Debug Multithreaded 使用靜態(tài)庫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)入庫kernel32.lib。這也就是為什么在嵌入式環(huán)境中,我們一般不能直接使用C標(biāo)準(zhǔn)庫。
在Linux環(huán)境當(dāng)然也有C標(biāo)準(zhǔn)庫,例如:
ld -o output /lib/crt0.o hello.o -lc
參數(shù)"-lc"就是在引用C標(biāo)準(zhǔn)庫libc.a。猜一猜"-lm"引用哪個(gè)庫文件?

2、常見的編譯參數(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)鏈接庫
_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)庫。

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)做過C變量的初始化,有初值的全局變量擁有了它們的初值,沒有初值的變量被設(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庫中(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"。可參見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開關(guān)是匹配的,也就是:
"console"對(duì)應(yīng)"mainCRTStartup"或者"wmainCRTStartup"
"windows"對(duì)應(yīng)"WinMain"或者"wWinMain"
我們可以通過手動(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的庫文件

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

 

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

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

6、結(jié)束語

研究這些問題的動(dòng)機(jī)是想弄清楚我們的程序是如何裝載、運(yùn)行的。但是,由于Windows不是開源平臺(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ù)開始運(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>
            国产在线成人| 欧美高清一区| 亚洲欧美激情在线视频| 性感少妇一区| 欧美激情精品久久久久久久变态| 一区二区在线视频播放| 亚洲综合色视频| 亚洲国产一区二区精品专区| 亚洲欧美大片| 欧美国产第一页| 香蕉久久精品日日躁夜夜躁| 国产在线观看精品一区二区三区| 久久综合一区二区| 亚洲一区二区三区精品动漫| 欧美国产精品日韩| 亚洲午夜一区| 日韩一级黄色片| 欧美精品激情在线观看| 亚洲电影第三页| 老司机精品久久| 欧美极品一区| 久久国产88| 午夜国产精品影院在线观看 | 亚洲免费一在线| 香蕉亚洲视频| 亚洲精品资源| 亚洲第一免费播放区| 久久精品亚洲精品国产欧美kt∨| 国产日韩欧美日韩| 欧美在线免费视频| 欧美v日韩v国产v| 欧美巨乳在线观看| 亚洲精品在线观看免费| 亚洲小说欧美另类婷婷| 国产精品露脸自拍| 欧美在线观看网站| 久久aⅴ国产欧美74aaa| 狠狠久久综合婷婷不卡| 久久综合电影一区| 久久伊人免费视频| 亚洲三级网站| 一区二区三区你懂的| 国产精品r级在线| 性亚洲最疯狂xxxx高清| 性欧美xxxx视频在线观看| 艳妇臀荡乳欲伦亚洲一区| 日韩亚洲精品视频| 91久久精品网| 亚洲免费精彩视频| 亚洲大片av| 久久爱www久久做| 亚洲区免费影片| 欧美一级在线视频| 亚洲美女免费精品视频在线观看| 欧美一区二区大片| 欧美在线影院| 国产精品乱码妇女bbbb| 日韩亚洲成人av在线| 日韩午夜激情| 性刺激综合网| 欧美在线短视频| 国产精品一区二区在线观看不卡| 老司机精品福利视频| 国产曰批免费观看久久久| 亚洲欧美日韩国产另类专区| 午夜久久一区| 欧美激情亚洲视频| 91久久精品一区二区三区| 国产欧美日韩一区| 亚洲激情女人| 一区二区三欧美| 久久一区二区三区av| 免费在线观看成人av| 国产精品免费在线| 先锋影音久久| 久久三级视频| 国产精品夜夜嗨| 亚洲电影免费观看高清完整版| ●精品国产综合乱码久久久久| 久久久久久亚洲精品杨幂换脸| 亚洲免费影视| 国产午夜精品一区理论片飘花| 欧美在线观看视频一区二区| 蜜臀久久99精品久久久久久9| 亚洲激情成人在线| 欧美一区二区三区啪啪| 久久性天堂网| 99精品热6080yy久久| 国产精品v片在线观看不卡| 亚洲男人的天堂在线| 久久午夜影视| 亚洲美洲欧洲综合国产一区| 国产精品白丝av嫩草影院| 欧美一级视频| 亚洲国产成人精品视频| 亚洲一级黄色片| 国产夜色精品一区二区av| 亚洲永久视频| 美女国内精品自产拍在线播放| 91久久精品国产91久久性色| 欧美日韩在线播| 欧美国产日韩精品免费观看| 狠狠综合久久av一区二区小说| 蜜桃久久av| 亚洲第一区在线| 午夜精品www| 亚洲国产日本| 国产精品欧美在线| 免费观看成人www动漫视频| 亚洲无线观看| 亚洲激情偷拍| 久久在线免费观看| 亚洲免费在线看| 亚洲人成小说网站色在线| 国产美女精品视频| 欧美日本在线| 久久免费偷拍视频| 亚洲欧美综合v| 99国产精品久久久久老师| 亚洲欧洲日产国产网站| 国产精品一区二区在线观看网站| 欧美不卡三区| 久久精品亚洲精品| 亚洲欧美国产毛片在线| 亚洲黄色成人| 欧美国产激情| 另类激情亚洲| 久久香蕉国产线看观看av| 亚洲欧美一区二区视频| 亚洲天堂成人在线视频| 欧美日韩国产专区| 日韩视频在线一区二区三区| 欧美韩日视频| 你懂的视频一区二区| 亚洲视频免费看| 亚洲黄色影片| 亚洲二区免费| 国产精品激情偷乱一区二区∴| 久久riav二区三区| 欧美一区二区三区另类 | 久久精品国产免费观看| 红桃视频国产精品| 狠狠狠色丁香婷婷综合久久五月| 国产精品入口尤物| 国产精品亚洲综合色区韩国| 国产精品欧美日韩| 国产欧美日韩亚洲一区二区三区 | 久久久久久亚洲精品杨幂换脸| 小黄鸭精品aⅴ导航网站入口| 亚洲欧美激情视频| 欧美一区中文字幕| 久久久久91| 欧美成人国产| 欧美日韩一区二区欧美激情| 欧美日韩另类视频| 国产精品女人网站| 国产视频不卡| 亚洲第一色中文字幕| 亚洲成人资源| 野花国产精品入口| 午夜精品视频网站| 另类天堂视频在线观看| 亚洲国产综合在线看不卡| 91久久国产综合久久蜜月精品| 亚洲精品视频中文字幕| 免费日韩av| 亚洲欧洲视频在线| 亚洲综合色网站| 久久久久久一区| 欧美精品福利| 国产精品一区久久| 亚洲国产精品久久久| 亚洲在线第一页| 久久人人九九| 99亚洲视频| 久久看片网站| 欧美日韩中文字幕精品| 欧美激情女人20p| 国产精品久久久久久久久婷婷| 国产一区二区中文| 99在线精品免费视频九九视| 翔田千里一区二区| 亚洲国产老妈| 午夜视频在线观看一区二区三区| 快she精品国产999| 老司机亚洲精品| 国产精品久久久久av| 在线激情影院一区| 亚洲男人第一网站| 蜜臀av一级做a爰片久久| 一二三区精品福利视频| 久久人人97超碰国产公开结果| 欧美午夜影院| 亚洲人成7777| 久久一区亚洲| 亚洲欧美日韩高清| 欧美久久精品午夜青青大伊人| 黄色另类av| 久久本道综合色狠狠五月| 日韩亚洲成人av在线|