開始之前,確認(rèn):
1.安裝完成Visual Studio 2005,確認(rèn)安裝的時(shí)候選中了Unicode MFC version以及CRT source code(默認(rèn)是選中的,如果你沒有改動(dòng)的話那么應(yīng)該是裝上了的);
2.找到我們要?jiǎng)邮中g(shù)的目錄,在$(Program Files)\Microsoft Visual Studio 8\VC 下,找出ATLMFC\SRC和CRT\SRC兩個(gè)文件夾;
3.(可選)安裝Platform SDK,復(fù)制最新版本的unicows.lib放到VC\PlatformSDK\LIB中。VC8自帶有unicows.lib,所以這一步可以不做。
一:編譯MSLU的CRT庫8.0
首先請(qǐng)備份一下VC\Lib、VC\CRT\SRC、VC\ATLMFC\SRC、VC\ATLMFC\lib這四個(gè)文件夾(包括子文件夾),假如不小心改錯(cuò)的話可以直接從備份的文件夾里復(fù)制文件出來。
CRT庫需要編譯的是這6個(gè)DLL:MSVCR80.DLL、MSVCP80.DLL、MSVCM80.DLL、MSVCR80D.DLL、MSVCP80D.DLL、MSVCM80D.DLL。為方便操作,我們把將要輸出的MSLU的CRT庫文件改為別的名字以免和原來的混淆,分別改成:MSLUR80.DLL、MSLUR80D.DLL、MSLUP80.DLL、MSLUP80D.DLL、MSLUM80.DLL、MSLUM80D.DLL(如果你改成別的名字的話,后面的操作請(qǐng)做相應(yīng)的改正)。
(1)先把SRC目錄下的相應(yīng)文件改名:
copy _SAMPLE_.RC MSLUR80.RC
copy SAMPLE_P.RC MSLUP80.RC
copy SAMPLE_M.RC MSLUM80.RC
copy SAMPLE_P.DEF MSLUP80.DEF
copy SAMPLD_P.DEF MSLUP80D.DEF
copy SAMPLE_M.DEF MSLUM80.DEF
copy SAMPLD_M.DEF MSLUM80D.DEF
copy SAMPLE_U.DEF MSLUU80.DEF
copy SAMPLD_U.DEF MSLUU80D.DEF
copy Intel\_SAMPLE_.DEF Intel\MSLUR80.DEF
copy Intel\_SAMPLD_.DEF Intel\MSLUR80D.DEF
(2)打開MSLUP80.DEF,修改LIBRARY SAMPLE_P為L(zhǎng)IBRARY MSLUP80;
打開MSLUP80D.DEF,修改LIBRARY SAMPLD_P為L(zhǎng)IBRARY MSLUP80D;
打開MSLUM80.DEF,修改LIBRARY SAMPLE_M為L(zhǎng)IBRARY MSLUM80;
打開MSLUM80D.DEF,修改LIBRARY SAMPLD_M為L(zhǎng)IBRARY MSLUM80D;
打開MSLUU80.DEF,修改LIBRARY SAMPLE_M為L(zhǎng)IBRARY MSLUM80;(注意此處不是MSLUU80而是MSLUM80)
打開MSLUU80D.DEF,修改LIBRARY SAMPLD_M為L(zhǎng)IBRARY MSLUM80D;(注意此處不是MSLUU80D而是MSLUM80D)
打開\Intel\MSLUR80.DEF,修改LIBRARY _SAMPLE_為L(zhǎng)IBRARY MSLUR80;
打開\Intel\MSLUR80D.DEF,修改LIBRARY _SAMPLD_為L(zhǎng)IBRARY MSLUR80D;
(3)打開SRC\makefile文件,修改開頭部分為:
RETAIL_DLL_NAME=MSLUR80
RETAIL_DLL_NAME=MSLUR80
RETAIL_LIB_NAME=MSLUR80
RETAIL_DLLCPP_NAME=MSLUP80
RETAIL_LIBCPP_NAME=MSLUP80
RETAIL_DLLMIXED_NAME=MSLUM80
RETAIL_LIBMIXED_NAME=MSLUM80
RETAIL_LIBPURE_NAME=MSLUU80
RETAIL_PT_LIBMIXED_NAME=MLSUPTM
RETAIL_PT_LIBPURE_NAME=MLSUPTU
DEBUG_DLL_NAME=MSLUR80D
DEBUG_LIB_NAME=MSLUR80D
DEBUG_DLLCPP_NAME=MSLUP80D
DEBUG_LIBCPP_NAME=MSLUP80D
DEBUG_DLLMIXED_NAME=MSLUM80D
DEBUG_LIBMIXED_NAME=MSLUM80D
DEBUG_LIBPURE_NAME=MSLUU80D
DEBUG_PT_LIBMIXED_NAME=MLSUPTMD
DEBUG_PT_LIBPURE_NAME=MLSUPTUD
RC_NAME=MSLUR80
RCCPP_NAME=MSLUP80
RCMIXED_NAME=MSLUM80
54行處修改VCTOOLS,注意自己的VS2005安裝目錄,假如安裝到E:\SoftWare\Microsoft Visual Studio 8\下,則此處改為:
VCTOOLS=E:\SoftWare\Microsoft Visual Studio 8\VC
1779, 1841, 1905, 1940, 2037, 2105, 2139, 2230行的kernel32.lib,改為:unicows.lib kernel32.lib(一共8個(gè)不要改多了);
(4)打開Visual Studio 2005 command prompt(從開始菜單或者是vc8的開發(fā)環(huán)境的菜單都可以啟動(dòng)),進(jìn)入到SRC目錄,輸入命令設(shè)置vctools,假如VS2005安裝在E:\SoftWare\Microsoft Visual Studio 8\下,則輸入:
Set vctools=E:\SoftWare\Microsoft Visual Studio 8\VC
完成后輸入bldnt啟動(dòng)SRC目錄下的bldnt.bat批處理文件編譯CRT庫。
譯者:我編譯的時(shí)候出來好多warning,不管他最后還是編譯完成了。
(5)編譯完成之后lib文件都放在SRC\BUILD\INTEL\目錄下,把文件名字改回來以便以前的程序可以鏈接,而且下面編譯MFC庫也需要。DLL文件不用改,新的lib文件知道該鏈接到誰那里。改名:
copy MLSUPTM.LIB PTRUSTM.LIB
copy MLSUPTMD.LIB PTRUSTMD.LIB
copy MLSUPTU.LIB PTRUSTU.LIB
copy MLSUPTUD.LIB PTRUSTUD.LIB
copy MSLUR80.LIB MSVCRT.LIB
copy MSLUR80D.LIB MSVCRTD.LIB
copy MSLUP80.LIB MSVCPRT.LIB
copy MSLUP80D.LIB MSVCPRTD.LIB
copy MSLUM80.LIB MSVCMRT.LIB
copy MSLUM80D.LIB MSVCMRTD.LIB
copy MSLUU80.LIB MSVCURT.LIB
copy MSLUU80D.LIB MSVCURTD.LIB
(6)把改名后的lib文件復(fù)制到VC\LIB目錄下覆蓋原來的文件。
(7)把步驟(4)、(5)、(6)再執(zhí)行一次來重建MSLUP80(D).DLL和靜態(tài)庫,以便他們能鏈接到我們自己的MSVCRT(D).LIB(指向我們的MSLUR80(D).DLL)。
關(guān)掉VS2005 command prompt,因?yàn)榫幾gCRT庫的時(shí)候定義了許多環(huán)境變量,這些會(huì)使后面MFC庫的編譯出現(xiàn)錯(cuò)誤。
6個(gè)新的DLL文件都在\VC\crt\src\build\intel下,把這6個(gè)文件復(fù)制到系統(tǒng)目錄下。
二:編譯MSLU的MFC庫8.0 Unicode版本
MFC庫需要編譯的是這4個(gè)DLL:
MFC80U.DLL (Unicode Release)
MFC80UD.DLL (Unicode Debug)
MFCM80U.DLL (Mixed mode/Managed Unicode Release)
MFCM80UD.DLL (Mixed mode/Managed Unicode Debug)。
為方便操作,我們把將要輸出的MSLU的CRT庫文件改為別的名字以免和原來的混淆,分別改成:
MFC80LU.DLL
MFC80LUD.DLL
MFCM80LU.DLL
MFCM80LUD.DLL
(如果你改成別的名字的話,后面的操作請(qǐng)做相應(yīng)的改正)。
(1)打開VC\ATLMFC\SRC\MFC\MFCDLL.MAK,在274、307行的link @<<,后面插入一行變成:
link @<<
/nod:kernel32.lib /nod:advapi32.lib /nod:user32.lib /nod:gdi32.lib /nod:shell32.lib /nod:comdlg32.lib /nod:version.lib /nod:mpr.lib /nod:rasapi32.lib /nod:winmm.lib /nod:winspool.lib /nod:vfw32.lib /nod:secur32.lib /nod:oleacc.lib /nod:oledlg.lib /nod:sensapi.lib
180行的
LIBS=$(CRTDLL) kernel32.lib gdi32.lib msimg32.lib user32.lib uuid.lib daouuid.lib htmlhelp.lib shlwapi.lib $(PROFLIB)
改為:
LIBS=$(CRTDLL) unicows.lib kernel32.lib advapi32.lib comdlg32.lib shell32.lib oledlg.lib winspool.lib oleacc.lib gdi32.lib msimg32.lib user32.lib uuid.lib daouuid.lib htmlhelp.lib shlwapi.lib $(PROFLIB)
(此處不同于原文。原文為:
LIBS=$(CRTDLL) unicows.lib kernel32.lib gdi32.lib msimg32.lib user32.lib uuid.lib daouuid.lib htmlhelp.lib shlwapi.lib $(PROFLIB)
譯者依照原文修改,編譯的時(shí)候出現(xiàn)了錯(cuò)誤,增加數(shù)個(gè)lib文件后編譯通過)
(2)打開VC\ATLMFC\SRC\MFCM\MFCMDLL.MAK,在253、272行的link @<<,后面插入一行變成:
link @<<
/nod:kernel32.lib /nod:advapi32.lib /nod:user32.lib /nod:gdi32.lib /nod:shell32.lib /nod:comdlg32.lib /nod:version.lib /nod:mpr.lib /nod:rasapi32.lib /nod:winmm.lib /nod:winspool.lib /nod:vfw32.lib /nod:secur32.lib /nod:oleacc.lib /nod:oledlg.lib /nod:sensapi.lib
215行的
LIBS=$(CRTDLL) $(CRTMDLL) mscoree.lib kernel32.lib gdi32.lib msimg32.lib user32.lib \
改為:
LIBS=$(CRTDLL) $(CRTMDLL) mscoree.lib unicows.lib kernel32.lib advapi32.lib comdlg32.lib shell32.lib oledlg.lib winspool.lib mpr.lib oleacc.lib gdi32.lib msimg32.lib user32.lib \
(此處原文為:
LIBS=$(CRTDLL) $(CRTMDLL) mscoree.lib unicows.lib kernel32.lib gdi32.lib msimg32.lib user32.lib \
其余說明同上)
(3)打開\VC\atlmfc\src\mfcm\INTEL\mfcm80u.def 文件,把第10行的LIBRARY mfcm80u 改為:
LIBRARY mfcm80Lu
打開\VC\atlmfc\src\mfcm\INTEL\mfcm80ud.def文件,把第10行的LIBRARY mfcm80ud改為:
LIBRARY mfcm80Lud
(4)打開\VC\atlmfc\src\mfcm\wfrmcmd.cpp文件,251行的#error Following information required to build private version用//注釋掉或者直接把該行刪掉;253行的[assembly: AssemblyTitle("")];改為:
[assembly: AssemblyTitle("mfcm80L")];
(5)打開\VC\atlmfc\src\mfcm\interfaces\AssemblyInfo.cpp文件,78行的#error Following information required to build private version用//注釋掉或者直接把該行刪掉;85行的[assembly: AssemblyTitle("")];改為:
[assembly: AssemblyTitle("mfcm80Lifaces")];
(6)在\VC\atlmfc\src\下建立一個(gè)批處理文件:buildmfc.bat,內(nèi)容為:
nmake -f atlmfc.mak MFC libname=MFC80L
(7)打開Visual Studio 2005 command prompt,進(jìn)入目錄\VC\atlmfc\src\,輸入buildmfc執(zhí)行buildmfc.bat編譯MFC庫。
編譯完成之后,在\VC\atlmfc\src\mfc\intel下有MFC80LU.DLL、MFC80LUD.DLL,在\VC\atlmfc\src\mfcm\INTEL下有MFCM80LU.DLL、MFCM80LUD.DLL,把這4個(gè)DLL文件復(fù)制到系統(tǒng)目錄下;在\VC\atlmfc\lib\INTEL下有MFC80LU.LIB、MFC80LUD.LIB、MFCM80LU.lib、MFCM80LUD.lib,把文件名改為:
MFC80U.LIB、MFC80UD.LIB、MFCM80U.lib、MFCM80UD.lib
把這四個(gè)lib文件復(fù)制到\VC\atlmfc\lib下覆蓋原來的文件就完成了。