有关 C 运行库以及使用 /clr(公共语言运行时编译) 进行编译时要使用哪些库的更多信息,请参见 CRT 库功能。
传递给链接器的给定调用的所有模块都必须使用相同的运行库编译器选项(/MD、/MT、/LD)进行编译。
有关如何使用运行库的调试版本的更多信息,请参见C 运行时库参考。
知识库文章 Q140584 也讨论如何选择适当的 C 运行库。
有关 DLL 的更多信息,请参见 Visual C++ 中的 DLL。
在 Visual Studio 开发环境中设置此编译器选项
打开项目的“属性页”对话框。 有关详细信息,请参见如何:打开项目属性页。
展开“C/C++”文件夹。
选择“代码生成”属性页。
修改“运行库”属性。
以编程方式设置此编译器选项
请参见RuntimeLibrary。
若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 Visual Studio 2017 RC 文档。
动态链接库 (DLL) 是作为函数和资源的共享库的可执行文件。 动态链接可使执行文件调用函数或使用存储在单独文件中的资源。
可从使用这些函数和资源的可执行文件中对其分别进行编译和部署。 操作系统可在已加载可执行文件时或在运行时按需将 DLL 加载到可执行的内存空间中。
DLL 还可以在可执行文件之间轻松共享函数和资源。 多个应用程序可同时访问内存中单个 DLL 副本的内容。
静态链接会将 .lib 文件中所有对象代码复制到可执行文件中。 动态链接仅包括在运行时用于查找和加载含有数据项或函数的 DLL 所需的信息。
在创建 DLL 时,还会创建一个包含此信息的 .lib 文件。 生成调用 DLL 的可执行文件时,链接器会使用 .lib 文件中的导出符号来为加载程序存储此信息。
当加载程序加载 DLL 时,该 DLL 会映射到你的可执行文件的内存空间中。 将调用 DLL 中的特殊函数 DllMain 来执行 DLL 要求的任何初始化。
使用动态链接代替静态链接有若干优点。 当使用 DLL 时,可以节省内存空间,并减少交换操作。 当多个应用程序可以使用 DLL 的单个副本时,可以节省磁盘空间和下载带宽。
DLL 可单独部署和更新,这可以使你在无需重新生成和发布所有代码的情况下,提供售后支持和软件更新。 DLL 是一种提供特定区域资源的简便方法,可以支持多语言程序,并简化创建国际版本应用程序的过程。
下列主题提供有关如何编程 DLL 的详细信息。
本节内容
演练:创建和使用动态链接库 (C++)
介绍如何使用 Visual Studio 创建和使用 DLL。
应用程序和 DLL 之间的区别
描述应用程序和 DLL 之间的基本区别。
使用 DLL 的优点
描述动态链接的优点。
DLL 的类型
提供有关可生成的不同类型的 DLL 的信息。
DLL 常见问题
提供有关 DLL 的常见问题解答。
将可执行文件链接到 DLL
描述与 DLL 的显式链接和隐式链接。
初始化 DLL
讨论当 DLL 加载时必须执行的 DLL 初始化代码(如分配内存)。
运行库行为
描述运行库如何执行 DLL 启动序列。
LoadLibrary 和 AfxLoadLibrary
讨论如何在运行时使用 LoadLibrary 和 AfxLoadLibrary 显式链接到 DLL。
GetProcAddress
讨论如何使用 GetProcAddress 获取 DLL 中导出函数的地址。
FreeLibrary 和 AfxFreeLibrary
讨论当不再需要 DLL 模块时如何使用 FreeLibrary 和 AfxFreeLibrary。
Windows 用来定位 DLL 的搜索路径
描述 Windows 操作系统用来定位系统上的 DLL 的搜索路径。
动态链接到 MFC 的规则 DLL 的模块状态
描述动态链接到 MFC 的规则 DLL 的模块状态。
扩展 DLL
解释通常实现从现有 Microsoft 基础类库类派生的可重用类的 DLL。
创建纯资源 DLL
讨论只包含资源(如图标、位图、字符串和对话框等)的纯资源 DLL。
MFC 应用程序中已本地化的资源:附属 DLL
提供对附属 DLL 的增强支持,该功能有助于创建针对多种语言进行本地化的应用程序。
导入和导出
描述如何将公共符号导入应用程序或从 DLL 导出函数。
Active 技术和 DLL
使对象服务器得以在 DLL 内实现。
DLL 中的自动化
描述“MFC DLL 向导”中的“自动化”选项提供的内容。
MFC DLL 命名约定
讨论 MFC 中包含的 DLL 和库如何遵循结构化命名约定。
从 Visual Basic 应用程序调用 DLL 函数
描述如何从 Visual Basic 应用程序中调用 DLL 函数。
相关章节
将 MFC 作为 DLL 的一部分使用
描述使你可以将 MFC 库作为 Windows 动态链接库的一部分来使用的规则 DLL。
MFC 的 DLL 版本
描述如何将 MFCxx.dll 和 MFCxxD.dll(其中 x 是 MFC 版本号)共享动态链接库用于 MFC 应用程序和扩展 DLL。
(NOTINBUILD)Visual C++ Programming Methodologies
提供描述有关 Visual C++ 库的概念信息和讨论各种编码技术和方法的主题的链接。
项目生成动态库
项目生成静态库
修改 目标计算机属性 x86 x64 ARM etc...
修改默认指令集
error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug
属性1. 在工程上右键->属性->c/c++->代码生成->运行库
四个选项及含义分别如下:
1.1 /MDd:MD_DynamicDebug,我理解是 “共享DLL中使用MFC” 时的 Debug
1.2 /MD:MD_DynamicRelease,我理解是 “共享DLL中使用MFC” 时的 Release
1.3 /MT:MD_StaticRelease,我理解是 “在静态库中使用MFC” 时的 Debug
1.4 /MTd:MD_StaticDebug,我理解是 “在静态库中使用MFC” 时的 Release
属性2. 在工程上右键->属性->配置属性-->常规-->MFC的使用
2.1 其中两个选项如下:
2.2 在共享DLL中使用MFC
2.3 在静态库中使用MFC
属性3. 我们有两种编译模式,一种是Release,一种是Debug。
问题来了:
VisualStudio报错:error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug
翻译:这句的意思是 检测到 “运行库” 的不匹配项:值“MTd_StaticDebug”不匹配值“MDd_DynamicDebug
人话:………………………… 属性1……………………… 属性1.4…………………………属性1.1
解决:能够看出来是Debug时的 属性1 和 属性2 不匹配,那要么将 属性1设置为 /MDd,要么将 属性2 设置为 在静态库中使用MFC。
反正编译模式(属性3)、MFC的使用(属性2)、运行库(属性3)要三位一体对应起来。