標 題: 優化C++程序編譯效率的實例
作 者:FlyToTheSpace
時 間:2005-12-27 22:12
鏈 接:http://bbs.pediy.com/showthread.php?threadid=19823
?
?
(1)自定義程序的入口
?(2)合并區段
?(3)不用調malloc,free等函數
?(3)不用cout來輸出,cin來輸入
?(4)如果調用了很多庫函數如memset,stycpy等等
?的話,請導入msvcrt.lib,不然編譯器會在程序里面
?導入靜態庫,這樣的話程序就會大很多。。
?(5)window編程不用mfc...
?減少程序運行內存占用量可以調用
?SetProcessWorkingSetSize(GetCurrentProcess(),-1,-1);
?
----------sample.cpp---------------------
?#include <windows.h>
?#include "sample.h"
?#include "mydll.h"
?#include "resource.h"
?//這下面自定義函數入口
?#pragma comment(linker, "/ENTRY:EntryPoint")
?#pragma comment(linker,"/ALIGN:0x400")
?//設置區段屬性,跟區段在內存起始地址
?//這里面要加寫入的權限,不然程序就運行不了了
?//E為執行,R為可讀,W為可寫
?//更多的說明請參見msdn
?#pragma comment(linker,"/SECTION:.text,ERW /ALIGN:0x1000")
?//下面合并區段,
?#pragma comment(linker,"/merge:.data=.text")
?#pragma comment(linker,"/merge:.rdata=.text")
?//下面導入函數
?#pragma comment(lib,"mydll.lib")
?//下面是函數的入口
?//得到WinMain里面的幾個參數
?//HINSTANCE hInstance=GetModuleHandle(NULL)
?//LPSTR lpCmdLine= GetCommandLine()
?//int nCmdShow? 這個可以自己填
?void EntryPoint()
?{
?? HINSTANCE hInstance;
?? hInstance=GetModuleHandle(NULL);
?? Sample pro(hInstance);
?? DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG),NULL,(DLGPROC)Sample::DialogProc,(LPARAM)&pro);
?}
?INT_PTR CALLBACK Sample::DialogProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
?{
?? static Sample *pro;
?? switch(message)
?? {
?? case WM_INITDIALOG:
???? pro=(Sample *)lParam;
???? pro->hwnd=hwnd;
???? pro->Init();
???? break;
?? case WM_COMMAND:
???? pro->WndPro_Command(wParam,lParam);
???? break;
?? case WM_CLOSE:
???? pro->WndPro_Close();
???? break;
?? case WM_TIMER:
???? //這里每秒鐘觸發一次
???? //來減少內存占用量
????????????????????? //試著在任務管理器里面看一下,sample.exe內存占用量是不是只有200多k,在我這里是這樣的
???? if(wParam==100)
???? {
?????? SetProcessWorkingSetSize(GetCurrentProcess(),
???????? -1,-1);
???? }
???? break;
?? }
?? return 0;
?}
?Sample::Sample(HINSTANCE hi)
?{
?? this->hInstance=hi;
?}
?int Sample::WndPro_Command(WPARAM wParam,LPARAM lParam)
?{
?? switch(wParam)
?? {
?? case IDOK:
???? this->LoadDll();
???? break;
?? case IDCANCEL:
???? this->WndPro_Close();
???? break;
?? }
?? return 0;
?}
?int Sample::WndPro_Close()
?{
?? EndDialog(hwnd,0);
?? return 0;
?}
?int Sample::Init()
?{
?? SetTimer(hwnd,100,100,NULL);
?? return 0;
?}
?int Sample::LoadDll()
?{
?? test(hwnd);
?? return 0;
?}
?UINT malloc_(size_t num)
?{
?? return (UINT)VirtualAlloc(NULL, num,MEM_RESERVE |MEM_COMMIT,PAGE_EXECUTE_READWRITE);
?}
?void free_(void * p)
?{
?? VirtualFree(p,NULL,MEM_RELEASE);
?}
?void ZeroMem(char * mem,int len)
?{
?? for(int i=0;i<len;i++)
???? mem[i]=0;
?}
?-------------------------------
?----------sample.h--------
?//下面是主函數的類
?class Sample
?{
?public:
?? static INT_PTR CALLBACK DialogProc(HWND, UINT, WPARAM, LPARAM);
?? Sample(HINSTANCE);
?private:
?? HINSTANCE hInstance;
?? HWND hwnd;
?? int WndPro_Command(WPARAM,LPARAM);
?? int WndPro_Close();
?? int Init();
?? int LoadDll();
?};
?///-->下為精簡的庫函數
?//分配內存最好不用庫函數malloc,
?//不要用cout 來輸出
?//如果你調用了很多庫函數的話
?//請在導入 msvcrt.lib
?UINT malloc_(size_t);//分配內存
?void free_(void *);//釋放內存
?void ZeroMem(char *,int);//清零
?-------------------------------
?---------mydll.cpp-----------
?#include <windows.h>
?#include "mydll.h"
?#pragma comment(linker, "/ENTRY:DllEntry")
?#pragma comment(linker,"/ALIGN:0x400")
?#pragma comment(linker,"/SECTION:.text,ERW /ALIGN:0x1000")
?#pragma comment(linker,"/merge:.data=.text")
?#pragma comment(linker,"/merge:.rdata=.text")
?BOOL APIENTRY DllEntry()
?{
?? return 1;
?}
?INT APIENTRY test(HWND hwnd)
?{
?? MessageBox(hwnd,"調用dll"," ",0);
?? return 0;
?}
?-----------------------
?下面是程序完整的代碼。。
附件:sample.rar
?
?
標 題: 答復
作 者:南蠻媽媽
時 間:2005-12-27 22:30
?
還能加些
?#pragma comment (linker, "/Filealign:0x200")
?#pragma comment (linker, "/OPT:REF")
?#pragma comment (linker, "/OPT:ICF")
?#pragma optimize("gsy", on)
?
?
標 題: 答復
作 者:FlyToTheSpace
時 間:2005-12-27 22:38
?
#pragma comment (linker, "/Filealign:0x200")
?在cl 里面,沒這個選項。
?用下面這個,但是加了沒用的,
?除非你的區段只有一個
?#pragma comment (linker, "/align:0x200")
?
下面的選項我還沒用過,
?#pragma comment (linker, "/OPT:REF")
?#pragma comment (linker, "/OPT:ICF")
?#pragma optimize("gsy", on)
?我編譯一般用命令行的,在.net 2003跟.net 2005
?里面的有好多選項連去都去不掉
?cl?? mydll.cpp mydll.def /link /dll /out:mydll.dll /machine:x86 /subsystem:windows user32.lib kernel32.lib
?rc sample.rc
?cl sample.cpp /link /machine:x86? user32.lib kernel32.lib /subsystem:windows sample.res
?del sample.obj sample.res? mydll.obj mydll.exp
?pause
?
?
標 題:Re: 優化C++程序編譯效率的實例
作 者:goldenegg
時 間:2005-12-28 10:08
?
?
引用:
--------------------------------------------------------------------------------
最初由 FlyToTheSpace 發布
(1)自定義程序的入口
(2)合并區段
(3)不用調malloc,free等函數
(3)不用cout來輸出,cin來輸入
(4)如果調用了很多庫函數如memset,stycpy等等
........
--------------------------------------------------------------------------------
?
SetProcessWorkingSetSize只是給你感觀上的內存變小而已,
如果你弄個hook進入photoshop這樣的程序去做這件事,
你就會馬上發現為什么別人并不怎么用 SetProcessWorkingSetSize
?SetProcessWorkingSetSize只是把內存寫回磁盤,當用到時又要從磁盤加載回來,程序一大,內存量本身占用大,你次讀寫磁盤那么慢,你就會發現雖然內存占用量下去了,但是硬盤一真轉個不停,程序基本上動不了...
所以如何節內存,不應從SetProcessWorkingSetSize下手,
當然現在你寫的小程序可以例外.
其實如果有個界面,占用個1M的內存實在是小事,不必要去計較.
?
?
標 題: 答復
作 者:FlyToTheSpace
時 間:2005-12-28 11:54
?
SetProcessWorkingSetSize
這個我是跟蹤realplay里面一個程序realsched.exe
發現的,其它減少內存用量的方法,還沒找到
?對于那些大一點的程序,就不能用settimer每隔段時間調用,
?當程序的界面最小化時,調用一下就可以了,
?比如potoshop 在顯示界面的時候,占用內存會很大,但只要你將它最小化
?內存占用量馬上就減下來了,很多大一點的程序都是這樣的。
?
?
標 題: 答復
作 者:dummy
時 間:2005-12-28 14:49
?
cl.exe 有許多關于程序代碼優化的開關:
?/////////////////////////////////////////////////////////
??????????????????????????????? -OPTIMIZATION-
?
/O1 minimize space????? /Op[-] improve floating-pt consistency
?/O2 maximize speed????? /Os favor code space
?/Oa assume no aliasing?????????????????? /Ot favor code speed
?/Ob<n> inline expansion (default n=0)??? /Ow assume cross-function aliasing
?/Od disable optimizations (default)????? /Ox maximum opts. (/Ogityb1 /Gs)
?/Og enable global optimization?????????? /Oy[-] enable frame pointer omission
?/Oi enable intrinsic functions
?
???????????????????????????? -CODE GENERATION-
?
/G3 optimize for 80386?????????????????? /Gy separate functions for linker
?/G4 optimize for 80486?????????????????? /Ge force stack checking for all funcs
?/G5 optimize for Pentium???????????????? /Gs[num] disable stack checking calls
?/G6 optimize for Pentium Pro???????????? /Gh enable hook function call
?/GB optimize for blended model (default) /GR[-] enable C++ RTTI
?/Gd __cdecl calling convention?????????? /GX[-] enable C++ EH (same as /EHsc)
?/Gr __fastcall calling convention??????? /Gi[-] enable incremental compilation
?/Gz __stdcall calling convention???????? /Gm[-] enable minimal rebuild
?/GA optimize for Windows Application???? /EHs enable synchronous C++ EH
?/GD optimize for Windows DLL???????????? /EHa enable asynchronous C++ EH
?/Gf enable string pooling??????????????? /EHc extern "C" defaults to nothrow
?/GF enable read-only string pooling????? /QIfdiv[-] enable Pentium FDIV fix
?/GZ enable runtime debug checks????????? /QI0f[-] enable Pentium 0x0f fix
?
?
標 題: 答復
作 者:dwing
時 間:2005-12-28 15:59
?
我有中文版的編譯器:
?
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
?Copyright (C) Microsoft Corporation 1984-2002. All rights reserved.
?
????????????????????????? C/C++ 編譯器選項
?
????????????????????????????? -優化-
?
/O1 最小化空間????????????????????????? /Op[-] 改善浮點數一致性
?/O2 最大化速度????????????????????????? /Os 優選代碼空間
?/Oa 假設沒有別名??????????????????????? /Ot 優選代碼速度
?/Ob<n> 內聯展開(默認 n=0)?????????????? /Ow 假設交叉函數別名
?/Od 禁用優化(默認值)??????????????????? /Ox 最大化選項。(/Ogityb2 /Gs)
?/Og 啟用全局優化??????????????????????? /Oy[-] 啟用框架指針省略
?/Oi 啟用內部函數
?
???????????????????????????? -代碼生成-
?
/G3 為 80386 進行優化?????????????????? /Gh 啟用 _penter 函數調用
?/G4 為 80486 進行優化?????????????????? /GH 啟用 _pexit 函數調用
?/G5 為 Pentium 進行優化???????????????? /GR[-] 啟用 C++ RTTI
?/G6 對 PPro、P-II、P-III 進行優化?????? /GX[-] 啟用 C++ EH (與 /EHsc 相同)
?/G7 對 Pentium 4 或 Athlon 進行優化???? /EHs 啟用 C++ EH (沒有 SEH 異常)
?/GB 為混合模型進行優化(默認)??????????? /EHa 啟用 C++ EH(w/ SEH 異常)
?/Gd __cdecl 調用約定??????????????????? /EHc extern "C" 默認為 nothrow
?/Gr __fastcall 調用約定???????????????? /GT 生成纖維安全 TLS 訪問
?/Gz __stdcall 調用約定????????????????? /Gm[-] 啟用最小重新生成
?/GA 為 Windows 應用程序進行優化???????? /GL[-] 啟用鏈接時代碼生成
?(按 <Enter> 繼續)
?/Gf 啟用字符串池??????????????????????? /QIfdiv[-] 啟用 Pentium FDIV 修復
?/GF 啟用只讀字符串池??????????????????? /QI0f[-] 啟用 Pentium 0x0f 修復
?/Gy 分隔鏈接器函數????????????????????? /QIfist[-] 使用 FIST 而不是 ftol()
?/GZ 啟用堆棧檢查(/RTCs)???????????????? /RTC1 啟用快速檢查(/RTCsu)
?/Ge 對所有函數強制堆棧檢查????????????? /RTCc 轉換為較小的類型檢查
?/Gs[num] 控制堆棧檢查調用?????????????? /RTCs 堆棧幀運行時檢查
?/GS 啟用安全檢查??????????????????????? /RTCu 未初始化的本地用法檢查
?/clr[:noAssembly] 為公共語言運行庫編譯
???? noAssembly - 不產生程序集
?/arch:<SSE|SSE2> CPU 結構的最低要求,以下內容之一:
???? SSE - 啟用支持 SSE 的 CPU 可用的指令
???? SSE2 - 啟用支持 SSE2 的 CPU 可用的指令
?
????????????????????????????? -輸出文件-
?
/Fa[file] 命名程序集列表文件??????????? /Fo<file> 命名對象文件
?/FA[sc] 配置程序集列表????????????????? /Fp<file> 命名預編譯頭文件
?/Fd[file] 命名 .PDB 文件??????????????? /Fr[file] 命名源瀏覽器文件
?/Fe<file> 命名可執行文件??????????????? /FR[file] 命名擴展 .SBR 文件
?/Fm[file] 命名映射文件
?
????????????????????????????? -預處理器-
?
/AI<dir> 添加到程序集搜索路徑?????????? /Fx 將插入的代碼合并到文件
?(按 <Enter> 繼續)
?/FU<file> 強制使用程序集/模塊?????????? /FI<file> 命名強制包含文件
?/C 不抽出注釋?????????????????????????? /U<name> 移除預定義宏
?/D<name>{=|#}<text> 定義宏????????????? /u 移除所有預定義宏
?/E 預處理到 stdout????????????????????? /I<dir> 添加到包含搜索路徑
?/EP 預處理到 stdout,沒有 #line???????? /X 忽略“標準位置”
?/P 預處理到文件
?
??????????????????????????????? -語言-
?
/Zi 啟用調試信息??????????????????????? /Ze 啟用擴展(默認)
?/ZI 啟用“編輯并繼續”調試信息????????? /Zl 省略 .OBJ 中的默認庫名
?/Z7 啟用舊式調試信息??????????????????? /Zg 生成函數原型
?/Zd 僅有行號調試信息??????????????????? /Zs 只進行語法檢查
?/Zp[n] 在 n 字節邊界上包裝結構????????? /vd{0|1} 禁用/啟用 vtordisp
?/Za 禁用擴展(暗指 /Op)????????????????? /vm<x> 指向成員的指針類型
?/Zc:arg1[,arg2] C++ 語言一致性,這里的參數可以是:
???? forScope - 對范圍規則強制使用標準 C++
???? wchar_t - wchar_t 是本機類型,不是 typedef
?
????????????????????????????? - 雜項 -
?
@<file> 選項響應文件??????????????????? /wo<n> 發出一次警告 n
?/?, /help 打印此幫助消息??????????????? /w<l><n> 為 n 設置警告等級 1-4
?/c 只編譯,不鏈接?????????????????????? /W<n> 設置警告等級(默認 n=1)
?(按 <Enter> 繼續)
?/H<num> 最大外部名稱長度??????????????? /Wall 啟用所有警告
?/J 默認 char 類型是 unsigned??????????? /Wp64 啟用 64 位端口定位警告
?/nologo 取消顯示版權消息??????????????? /WX 將警告視為錯誤
?/showIncludes 顯示包含文件名??????????? /WL 啟用單行診斷
?/Tc<source file> 將文件編譯為 .c??????? /Yc[file] 創建 .PCH 文件
?/Tp<source file> 將文件編譯為 .cpp????? /Yd 將調試信息放在每個 .OBJ 中
?/TC 將所有文件編譯為 .c???????????????? /Yl[sym] 為調試庫插入 .PCH 引用
?/TP 將所有文件編譯為 .cpp?????????????? /Yu[file] 使用 .PCH 文件
?/V<string> 設置版本字符串?????????????? /YX[file] 自動 .PCH
?/w 禁用所有警告???????????????????????? /Y- 禁用所有 PCH 選項
?/wd<n> 禁用警告 n?????????????????????? /Zm<n> 最大內存分配(默認為 %)
?/we<n> 將警告 n 視為錯誤
?
???????????????????????????????? -鏈接-
?
/MD 與 MSVCRT.LIB 鏈接????????????????? /MDd 與 MSVCRTD.LIB 調試庫鏈接
?/ML 與 LIBC.LIB 鏈接??????????????????? /MLd 與 LIBCD.LIB 調試庫鏈接
?/MT 與 LIBCMT.LIB 鏈接????????????????? /MTd 與 LIBCMTD.LIB 調試庫鏈接
?/LD 創建 .DLL?????????????????????????? /F<num> 設置堆棧大小
?/LDd 創建 .DLL 調試庫?????????????????? /link [鏈接器選項和庫]
?
?
標 題:Re: 優化C++程序編譯效率的實例
作 者:dwing
時 間:2005-12-28 16:49
?
樓主的文章寫的不錯!
?但標題寫的有點疑慮.
?因為優化有幾種意義:速度優化,代碼空間優化,編譯速度優化和內存占用優化.
?一般來說需要速度優化的地方,代碼空間優化和內存占用優化就要犧牲一些.
?
編譯速度優化可能意義不太大,不過我還是補充一下:
?例如添加以下宏可以提高一些編譯速度,在硬盤和CPU速度較慢的機器上尤為明顯.
?#define VC_EXTRALEAN
?#define WIN32_LEAN_AND_MEAN
?#define WIN32_EXTRA_LEAN
?另外如果關閉預編譯頭文件的功能,可以大大提高第一次編譯的速度,并減少硬盤占用的空間.
?強烈建議編譯小程序的時候關閉這個功能,因為它默認是啟動的.
?
下面評價一下樓主的一些優化,僅供參考.
?
引用:
--------------------------------------------------------------------------------
(1)自定義程序的入口
--------------------------------------------------------------------------------
?
?一般不建議使用自定義入口,雖然只有使用動態庫時只節省不到1KB.
?主要是考慮到C++的全局對象的構造,如果自定義就會被忽略掉.
?不過如果確實想使代碼精簡到極限,可以考慮.
?此優化對速度幾乎無影響.
?
引用:
--------------------------------------------------------------------------------
(2)合并區段
--------------------------------------------------------------------------------
?
?這一項對減小PE文件大小很有幫助,但一定要注意正確設置好節(段)屬性,否則后果不可知.
?表面上此優化對速度無影響,但可能會導致數據cache與代碼cache重疊,不利于CPU的執行.
?如果需要加壓縮殼,此優化可能無效,如果合并不當可能還會使壓縮能力降低(例如代碼被混合在數據當中).
?
引用:
--------------------------------------------------------------------------------
(3)不用調malloc,free等函數
--------------------------------------------------------------------------------
?
?分配內存不用malloc,free等函數用什么?new和delete嗎?后者當然更好:)
?Win32API有眾多分配內存的函數,malloc等C/C++標準庫當然使用的是API中的
?堆分配(HeapAlloc),而堆分配調用虛擬分配(VirtualAlloc).效率當然是后者高一些.
?但實際內存分配一般在初始化過程中使用,而且使用次數也不應過多(以避免內存碎片).
?所以速度影響幾乎可忽略.
?代碼量應該不會有太大影響.
?
引用:
--------------------------------------------------------------------------------
(3)不用cout來輸出,cin來輸入
--------------------------------------------------------------------------------
?
?這個確實可以使用C標準庫來替代,而且使用靈活,速度更快一些.
?如果使用動態庫,代碼量差距不大.
?
引用:
--------------------------------------------------------------------------------
(4)如果調用了很多庫函數如memset,stycpy等等的話,請導入msvcrt.lib,
?不然編譯器會在程序里面導入靜態庫,這樣的話程序就會大很多。。
--------------------------------------------------------------------------------
?
?這點不用擔心了.原因如下:
?如果使用最快速度優化,memset,stycpy,sin等某些內存/字符串/數學函數會被自動內聯到程序中,
?無論是否使用動態庫還是靜態庫,速度要快的多,我也推薦這么做.
?使用次數過多代碼量會大一些.但如果加壓縮殼的話影響不會太大.
?如果使用最小代碼優化,自動內聯的函數不會內聯,此時可使用動態庫以減小代碼量.
?如果只使用1~2次某個可自動內聯的函數的話代碼量可能反而更多(還要考慮到導入表)
?
引用:
--------------------------------------------------------------------------------
(5)window編程不用mfc...
--------------------------------------------------------------------------------
?
?呵呵,這就不一定了.目前如果沒有還在使用Win95系統的話,MFC的動態庫就可以大膽使用了.
?但要注意一定要使用MFC42.DLL的庫,也就是VC6.0自帶的庫,高版本的可能連WinXP也不會自帶.
?
引用:
--------------------------------------------------------------------------------
減少程序運行內存占用量可以調用SetProcessWorkingSetSize(GetCurrentProcess(),-1,-1);
--------------------------------------------------------------------------------
?
?又學到一招!
?但我不得不說一下:這是個騙人的招數.拿來騙一騙初級用戶還可以-_-
?因為任務管理器只顯示進程當前使用的物理內存大小,所以使用這個招數雖然可以降低物理內存占用.
?但虛擬內存并無減少,所以這個技巧只建議使用在后臺或很少工作的進程.
?經常使用這個函數會造成CPU負擔過重,磁盤交換文件的讀寫也會更頻繁.這樣會很影響進程的執行效率.
?其實不需要在意物理內存占用,如果物理內存不夠用,系統會自動降低不常工作的進程的物理內存.
?
?
標 題: 答復
作 者:dwing
時 間:2005-12-28 17:05
?
再補充幾點:
引用:
--------------------------------------------------------------------------------
#pragma comment (linker, "/align:0x200")
--------------------------------------------------------------------------------
?
?這著我也經常用,不過我經常這么寫(只用于VC6.0):
?#pragma comment(linker,"/OPT:NOWIN98")
?但是如果要加壓縮殼的話,這個PE文件空間優化沒有一點作用,
?因為虛擬地址沒有改變(仍然是4KB,而且無法改變).
?
引用:
--------------------------------------------------------------------------------
#pragma comment (linker, "/ALIGN:16")
--------------------------------------------------------------------------------
?
?對齊到16字節可能有兼容性問題,可能不能在Win9x中運行.
?
引用:
--------------------------------------------------------------------------------
#pragma comment(linker, "/ENTRY:EntryPoint")
--------------------------------------------------------------------------------
?
?如果沒有不加入默認庫的話可以不用自定義入口.
?而直接用void mainCRTStartup()或void WinMainCRTStartup()即可.
?但不使用默認庫可能某些浮點數的轉換會出現問題,雖然可以使用其他方法解決.
?
引用:
--------------------------------------------------------------------------------
#pragma comment (linker, "/OPT:REF")
?#pragma comment (linker, "/OPT:ICF")
--------------------------------------------------------------------------------
?
?這一項其實在默認的優化編譯設置中已經有了,不用寫出來.
?如果啟動"/OPT:REF"的話,"/OPT:ICF"默認會自動啟動.
?
引用:
--------------------------------------------------------------------------------
#pragma comment (linker,"/merge:.rsrc=.text")
--------------------------------------------------------------------------------
?
?這項一定不要加,有時候如果資源不在某個節(段)的開始,程序的圖標可能不能顯示出來.
?
?
標 題: 答復
作 者:goldenegg
時 間:2005-12-29 21:13
?
?
引用:
--------------------------------------------------------------------------------
最初由 FlyToTheSpace 發布
?SetProcessWorkingSetSize
?這個我是跟蹤realplay里面一個程序realsched.exe
?發現的,其它減少內存用量的方法,還沒找到
?
對于那些大一點的程序,就不能用settimer每隔段時間調用,
?........
--------------------------------------------------------------------------------
?
?nono,不是大的程序自己搞的,是操作系統做的。
?在你的窗口最小化的時候,操作系統自動幫你把內存最小化了。
?所以,你自己就更沒有必要去調這個函數了。
?
引用:
--------------------------------------------------------------------------------
最初由 dwing 發布
?
呵呵,這就不一定了.目前如果沒有還在使用Win95系統的話,MFC的動態庫就可以大膽使用了.
?但要注意一定要使用MFC42.DLL的庫,也就是VC6.0自帶的庫,高版本的可能連WinXP也不會自帶.
?
--------------------------------------------------------------------------------
?
nono,mfc42.dll從win98se開始,到longhorn都是默認有的。vc6 mfc的程序,編成release就可以在每臺機器上跑了,不用到處拷個mfc42.dll
?
?
標 題: 答復
作 者:dwing
時 間:2005-12-30 15:38
?
?
引用:
--------------------------------------------------------------------------------
最初由 goldenegg 發布
?nono,mfc42.dll從win98se開始,到longhorn都是默認有的。vc6 mfc的程序,編成release就可以在每臺機器上跑了,不用到處拷個mfc42.dll
?........
--------------------------------------------------------------------------------
?
?可能是對我的話理解有誤.我們的觀點是一樣的.
?再補充一下:
?Win95OSR2(Win97)雖然自帶msvcrt40.dll和mfc30.dll,但不是目前的標準庫了.
?Win98SE自帶了msvcrt.dll和mfc42.dll,Win98第一版不知有沒有.
?WinXP第一版肯定不帶msvcr71.dll和mfc71.dll,這些是VC7.1才使用的動態庫.