当前位置:首页 » 编程软件 » 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下的工程大小会稍小一些,但是在另一台机器上运行时务必保证那一台机器上有动态库支持
希望采纳

热点内容
安卓如何扫描浏览器中的二维码 发布:2025-03-21 08:04:10 浏览:677
如何把服务器挂在网站上 发布:2025-03-21 08:03:32 浏览:206
中国彩票的网是什么密码 发布:2025-03-21 07:25:06 浏览:442
苹果税与安卓哪个收费更狠 发布:2025-03-21 07:17:52 浏览:294
通过一个ip访问两台服务器吗 发布:2025-03-21 07:06:12 浏览:522
怎么让服务器查不到我的ip地址 发布:2025-03-21 07:05:27 浏览:184
编译器有什么用 发布:2025-03-21 07:00:24 浏览:78
android百度云盘 发布:2025-03-21 06:59:47 浏览:261
青云存储 发布:2025-03-21 06:50:03 浏览:403
王者荣耀有脚本吗 发布:2025-03-21 06:50:00 浏览:806