创建客户端应用
1、在菜单栏上,选择“文件”>“新建”>“项目”,打开“创建新项目”对话框 。
2、在对话框顶部,将“语言” 设置为“C++” ,将“平台” 设置为“Windows” ,并将“项目类型” 设置为“控制台” ,选择“控制台应用”,然后选择“下一步” 。
3、在“配置新项目”页面,在“项目名称”框中输入“MathClient”
接下来,要在源代码中调用 MathLibrary 函数,你的项目必须包括 MathLibrary.h 文件 。
- 可以将此头文件复制到客户端应用项目中,然后将其作为现有项添加到项目中。对于第三方库,此方法可能是一个不错的选择。
- 但是,如果同时处理 DLL 的代码和客户端的代码,则头文件可能会变为不同步。要避免此问题,请设置项目中的“附加包含目录” 路径,使其包含指向原始头文件的路径。
将 DLL 头文件添加到包含路径
1、右键单击“解决方案资源管理器” 中的“MathClient” 节点以打开“属性页” 对话框。
2、在“配置”下拉框中,选择“所有配置”,在左窗格中,选择“配置属性” > “C/C++” > “常规” 。在属性窗格中,选择“附加包含目录” 编辑框旁的下拉控件,然后选择“编辑” 。
3、修改MathClient.cpp
// MathClient.cpp : Client app for MathLibrary DLL.
// #include "pch.h" Uncomment for Visual Studio 2017 and earlier
#include <iostream>
#include "MathLibrary.h"
int main()
{
// Initialize a Fibonacci relation sequence.
fibonacci_init(1, 1);
// Write out the sequence values until overflow.
do {
std::cout << fibonacci_index() << ": "
<< fibonacci_current() << std::endl;
} while (fibonacci_next());
// Report count of values written before overflow.
std::cout << fibonacci_index() + 1 <<
" Fibonacci sequence values fit in an " <<
"unsigned 64-bit integer." << std::endl;
}
4、生成解决方案
此代码可进行编译,但不能链接。 如果现在生成客户端应用,则错误列表会显示几个 LNK2019 错误。 这是因为项目丢失了一些信息:你尚未指定项目在 MathLibrary.lib 库上有依赖项 。 而且,你尚未告诉链接器如何查找 MathLibrary.lib 文件 。
要解决此问题,可以直接将库文件复制到客户端应用项目中。 链接器将自动查找并使用它。 但是,如果库和客户端应用都处于开发过程中,则可能会导致一个副本中的更改未在另一个副本中显示。 要避免此问题,可以设置“附加依赖项”属性,告诉生成系统项目依赖于 MathLibrary.lib 。 此外,还可设置项目中的“附加库目录” 路径,使其在链接时包含指向原始库的路径。
将 DLL 导入库添加到项目中
1、右键单击“解决方案资源管理器”中的“MathClient”节点,然后选择“属性”以打开“属性页”对话框 。
2、在“配置”下拉框中,选择“所有配置”(如果尚未选择) 。 它可确保任何属性更改同时应用于调试和发布版本。
3、在左窗格中,选择“配置属性” > “链接器” > “输入” 。 在属性窗格中,选择“附加依赖项” 编辑框旁的下拉控件,然后选择“编辑” 。
4、在“附加依赖项”对话框中,将 【MathLibrary.lib 】这个名字复制黏贴到顶部编辑控件的列表中 。选择“确定” 返回到“属性页” 对话框。注意是.lib而不是.dll, 否则编译时:LNK1107 文件无效或损坏: 无法在 0x350 处读取
5、在左窗格中,选择“配置属性” > “链接器” > “常规” 。 在属性窗格中,选择“附加库目录” 编辑框旁的下拉控件,然后选择“编辑” 。
6、生成解决方案
客户端应用现在可以成功编译和链接
7、运行
仍未具备运行所需的全部条件。 当操作系统加载应用时,它会查找 MathLibrary DLL。 如果在某些系统目录、环境路径或本地应用目录中找不到 DLL,则加载会失败:
避免此问题的一种方法是将 DLL 复制到包含客户端可执行文件的目录中,作为生成过程的一部分。 可将“后期生成事件”添加到项目中,以此添加一条命令,将 DLL 复制到生成输出目录 。 此处指定的命令仅在 DLL 丢失或发生更改时才复制它。 此命令使用宏根据生成配置在调试或发布位置之间进行复制。
在生成后事件中复制 DLL
1、右键单击“解决方案资源管理器”中的“MathClient”节点,然后选择“属性”以打开“属性页”对话框 。
2、在“配置”下拉框中,选择“所有配置”(如果尚未选择) 。 它可确保任何属性更改同时应用于调试和发布版本。
3、在左窗格中,选择“配置属性” > “生成事件” > “生成后事件” 。
4、在属性窗格中,在“命令行”字段中选择编辑控件 。 如果已按照指示将客户端项目置于 DLL 项目的单独解决方案中,则输入以下命令:
xcopy /y /d "..\..\MathLibrary\$(IntDir)MathLibrary.dll" "$(OutDir)"
如果 DLL 和客户端项目在其他目录中,请更改 DLL 的相对路径以进行匹配。
5、在菜单栏上,选择“调试” > “启动而不调试”