當前位置:首頁 » 編程軟體 » mfc靜態編譯

mfc靜態編譯

發布時間: 2022-04-19 11:48:46

Ⅰ 如何減小 visual c++ 2010 靜態編譯出的 mfc 可執行文件的大小

工程切換到RELEASE模式沒有?用RELEASE重新生成會小很多。此外,還可以再加殼加密壓縮,網上有很多加殼工具。

Ⅱ MFC的使用:在靜態庫中使用 MFC是什麼意思

如果選擇"在共享 DLL 中使用 MFC"的話,你編譯後的程序中不包含MFC庫,所以文件會比較小,但是如果你的程序直接移到一個沒有安裝過MFC的機器上時,可能會導致找不到MFC的DLL,如果選擇"靜態庫中使用 MFC ",那你編譯後的程序就直接包含了調用MFC的部分的庫,文件可能會大一些,但是可以直接移到其他機器上運行.
一般都是選擇「在共享 DLL 中使用 MFC」,這樣程序少,而且Windows下大都有MFC的DLL.

Ⅲ MFC 設置靜態鏈接的時候會有問題,動態鏈接能夠正常運行。 運行庫的幾種方式都試過了,都不行。

VS2008,項目——屬性——配置屬性——C/C++——代碼生成:他有/MT,/MTd,/Md,/MDd四個選項,你必須讓所有使用的庫都使用相同的配置,否則就會有相應的提示,甚至可能會出現無法解析的函數。有時我們使用的庫不是自己可以控制的,那麼就只能把工程屬性設置成河你使用的庫相同的選項。
錯誤 1 error LNK2005: _free 已經在 libcmtd.lib(dbgheap.obj) 中定義 MSVCRT.lib
錯誤 2 error LNK2005: _malloc 已經在 libcmtd.lib(dbgheap.obj) 中定義 MSVCRT.lib
.....

如果有一堆的重定義錯誤發生在同一個lib中,而且跟它沖突的也是同一個lib,那麼這個兩個lib的功能應該是一樣的,可以2選一,只要在「忽略特定的庫」內填入需要忽略的庫。

項目屬性-配置屬性-鏈接器-輸入-忽略特定的庫:libcmtd.lib
項目屬性-配置屬性-常規-MFC的使用:在共享 DLL 中使用 MFC

MSVCRT.lib 和libcmt.lib的沖突還是比較常見的。
從錯誤信息可以看出是msvcrt.lib和libcmt.lib庫中重復定義了__isctype等符號。為什麼會出現這樣的問題呢?這就要從這兩個庫的作用說起了。
msvcrt.lib是VC中的Multithreaded DLL 版本的C運行時庫,而libcmt.lib是Multithreaded的運行時庫。在同一個項目中,所有的源文件必須鏈接相同的C運行時庫。如果某一文 件用了Multithreaded DLL版本,而其他文件用了Single-Threaded或者Multithreaded版本的庫,也就是說用了不同的庫,就會導致這個警告的出現。

告警信息的意思我們明白之後,就要找造成這個問題的原因了。在項目設置中我們可以看到當前項目使用的是Multithreaded非DLL版本的運 行時庫,這說明項目中還有其他文件用到了不是這個版本的運行時庫。很顯然,就是openssl的靜態庫。查看openssl中ms下的nt.mak,我們 可以發現靜態庫版本中openssl使用編譯開關/MD進行編譯的,也就是說openssl靜態庫是默認用的Multithreaded DLL 版本的C運行時庫。

原因找到了。那麼解決方法,很明顯有兩個。總之就是將兩個項目的運行時庫統一。

簡單的方式就是將項目的動態庫修改為使用Multithreaded DLL 版本的C運行時庫即可。
某些情況下你的項目可能不能改變當前的運行時庫,你可以將openssl的nt.mak中的/MD開關修改為/MT然後重新編譯openssl靜態庫就可以了。

默認庫「library」與其他庫的使用沖突;請使用 /NODEFAULTLIB:library LNK4098 的解決辦法
您試圖與不兼容的庫鏈接。

注意
運行時庫現在包含可防止混合不同類型的指令。如果試圖在同一個程序中使用不同類型的運行 時庫或使用調試和非調試版本的運行時庫,則將收到此警告。例如,如 果編譯一個文件以使用一種運行時庫,而編譯另一個文件以使用另一種運行時庫(例如單線程運行時庫對多線程運行時庫),並試圖鏈接它們,則將得到此警告。應 將所有源文件編譯為使用同一個運行時庫。有關更多信息,請參見使用運行時庫(/MD、/MT 和 /LD)編譯器選項。

可以 使用鏈接器的 /VERBOSE:LIB 開關來確定鏈接器搜索的庫。如果收到 LNK4098,並想創建使用如單線程、非調試運行時庫的可執行文件,請使用 /VERBOSE:LIB 選項確定鏈接器搜索的庫。鏈接器作為搜索的庫輸出的應是 LIBC.lib,而非 LIBCMT.lib、MSVCRT.lib、LIBCD.lib、LIBCMTD.lib 和 MSVCRTD.lib。對每個要忽略的庫可以使用 /NODEFAULTLIB,以通知鏈接器忽略錯誤的運行時庫。

下表顯示根據要使用的運行時庫應忽略的庫。

若要使用第一行運行時庫 請忽略第2行的這些庫
單線程 (libc.lib)
libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib

多線程 (libcmt.lib)
libc.lib、msvcrt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib

使用 DLL 的多線程 (msvcrt.lib)
libc.lib、libcmt.lib、libcd.lib、libcmtd.lib、msvcrtd.lib

調試單線程 (libcd.lib)
libc.lib、libcmt.lib、msvcrt.lib、libcmtd.lib、msvcrtd.lib

調試多線程 (libcmtd.lib)
libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、msvcrtd.lib

使用 DLL 的調試多線程 (msvcrtd.lib)
libc.lib、libcmt.lib、msvcrt.lib、libcd.lib、libcmtd.lib

例如,如果收到此警告,並希望創建使用非調試、單線程版本的運行時庫的可執行文件,可以將下列選項與鏈接器一起使用:

/NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:msvcrt.lib /NODEFAULTLIB:libcd.lib /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:msvcrtd.lib

Ⅳ 為什麼vs2015做MFC,靜態編譯體積這么大

打開項目,選擇屬性,分三步:(1)選擇左上角的configuration->Active(Debug)configurationproperties->general->useofMFC,選擇useMFCinastaticlibrary。(2)左上角configuration->debugC/C++->codegeneration->runtimelibrary->multi-threadeddebug(/MTd)(3)configuration->releaseC/C++->codegeneration->runtimelibrary->multi-threaded(/MT)

Ⅳ mfc程序不能靜態編譯的問題

把exe刪掉之後在編譯

Ⅵ MFC中怎麼調用靜態庫

有兩種方法,靜態載入,和動態載入為了省麻煩,用靜態就行了,除了要把lib,放進來,dll也要放進來#pragma comment(lib, "a.lib")
再加上那個庫里的頭文件。然後就可以直接使用動lib里的函數或者變數了

Ⅶ VS2010修改C++項目為「靜態庫中使用MFC」編譯問題

(1)項目 -> **屬性 -> 配置屬性 -> 常規 -> MFC的使用 :在靜態庫中使用MFC。
(2)項目 -> **屬性 -> 配置屬性 -> C/C++ -> 代碼生成 -> 運行庫 :多線程(/MT)。

2 在debug的時候要選 /MTd, Release 版本的再用 /MT

Ⅷ 靜態鏈接編譯通過,使用MFC共享dll編譯不過

#ifdef _AFXDLL
#define DECLARE_MESSAGE_MAP() \
private: \
static const AFX_MSGMAP_ENTRY _messageEntries[]; \
protected: \
static AFX_DATA const AFX_MSGMAP messageMap; \
static const AFX_MSGMAP* PASCAL _GetBaseMessageMap(); \
virtual const AFX_MSGMAP* GetMessageMap() const; \

#else
#define DECLARE_MESSAGE_MAP() \
private: \
static const AFX_MSGMAP_ENTRY _messageEntries[]; \
protected: \
static AFX_DATA const AFX_MSGMAP messageMap; \
virtual const AFX_MSGMAP* GetMessageMap() const; \

#endif

#ifdef _AFXDLL
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
const AFX_MSGMAP* PASCAL theClass::_GetBaseMessageMap() \
{ return &baseClass::messageMap; } \
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \
AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
{ &theClass::_GetBaseMessageMap, &theClass::_messageEntries[0] }; \
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
{ \

#else
#define BEGIN_MESSAGE_MAP(theClass, baseClass) \
const AFX_MSGMAP* theClass::GetMessageMap() const \
{ return &theClass::messageMap; } \
AFX_COMDAT AFX_DATADEF const AFX_MSGMAP theClass::messageMap = \
{ &baseClass::messageMap, &theClass::_messageEntries[0] }; \
AFX_COMDAT const AFX_MSGMAP_ENTRY theClass::_messageEntries[] = \
{ \

#endif

#define END_MESSAGE_MAP() \
{0, 0, 0, 0, AfxSig_end, (AFX_PMSG)0 } \
}; \

Ⅸ vs2013如何靜態編譯

項目屬性-配置屬性-常規-MFC的使用-使用標准Windows庫(不用MFC)
然後,C/C++-代碼生成-運行庫-多線程/MT或者多線程調試/MTd
帶d的是鏈接調試版本,DEBUG項目選/MTd,Release項目選/MT
如果使用MFC,在MFC的使用中設置靜態、動態鏈接,代碼生成中必須使用<從上級繼承>

Ⅹ MFC向導中,「在共享DLL中使用MFC」和「在靜態庫中使用MFC"有什麼區別

靜態庫中編譯出來的可執行文件拿到其它機器上也可以運行,共享DLL中編譯出來的可執行文件在本機上可以執行,若拿到其它機器上就需要相應的動態庫支持。 另外,共享DLL下的工程大小會稍小一些,但是在另一台機器上運行時務必保證那一台機器上有動態庫支持
希望採納

熱點內容
app服務端源碼 發布:2025-03-21 05:56:41 瀏覽:102
信道估計演算法 發布:2025-03-21 05:37:33 瀏覽:865
怎麼用命令方塊做出伺服器 發布:2025-03-21 05:22:58 瀏覽:798
歌曲腳本 發布:2025-03-21 05:19:31 瀏覽:569
python的range函數 發布:2025-03-21 05:18:48 瀏覽:720
php信息錄入系統 發布:2025-03-21 05:17:21 瀏覽:345
安卓手機里的hms是什麼 發布:2025-03-21 05:15:56 瀏覽:34
恢復出廠設置如何設置密碼 發布:2025-03-21 05:15:46 瀏覽:956
如何設置網頁密碼鎖 發布:2025-03-21 05:15:01 瀏覽:816
linux如何安裝windows 發布:2025-03-21 05:09:19 瀏覽:210