C++——编写和调用动态库
1、编写动态库,新建项目——》冬天链接库(DLL)
2、新建mydll.h 和mydll.cpp
在mydll.h中添加一个导出函数如下:
#pragma once //高亮显示的部分说明是有效的 #ifdef BUILD_MYDLL #define API_SYMBOL __declspec(dllexport) #else #define API_SYMBOL __declspec(dllimport) #endif extern "C" API_SYMBOL int convert_arry(int* data, int len);
在mydll.cpp中编辑
#define BUILD_MYDLL //由于是需要用导出函数,则需要使得头文件有效 #include"pch.h" #include "mydll.h" #include <iostream> using namespace std; int convert_arry(int* data, int len) { for (int i = 0; i < len; i++) { std::cout << data[i] << ","; } std::cout << endl; int nTotal = 0; for (int i = 0; i < len; i++) { nTotal += data[i]; --data[i]; } return nTotal; }
然后点击项目,生成。
3、创建一个应用程序来调用动态库
右键点击程序、添加新建项目、控制台应用。如下
4、在DemoInvokeDll中引入头文件“mydll.h”之前需要添加搜索路径,
具体操作为:选中测试项目——》属性——》C/C++常规——》附加包含目录——》选择动态库的文件夹——》应用,确定。
5、引入lib符号文件,右键选择项目属性,链接器——》输入——》附加依赖项——》输入动态链接库的名字,如下:
再给lib添加个搜索路径:链接器——》常规——》附加库目录
其中该目录下的内容如下:
6、编写调用代码,如下:
// DemoInvokeDll.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include "mydll.h" //使用隐式调用的方式调用动态库 //需要三个东西:.lib .dll .h int main() { int arr[] = { 1,4,2,23,56,2 }; int len = sizeof(arr) / sizeof(int); int nTotal = convert_arry(arr, len); std::cout << "数组元素求和的结果:" << nTotal <<std::endl; std::cout << "数组元素的新值:" << std::endl; for (int i = 0; i < len; i++) { std::cout << arr[i] << ","; } std::cout << std::endl; system("pause"); } // 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单 // 调试程序: F5 或调试 >“开始调试”菜单 // 入门使用技巧: // 1. 使用解决方案资源管理器窗口添加/管理文件 // 2. 使用团队资源管理器窗口连接到源代码管理 // 3. 使用输出窗口查看生成输出和其他消息 // 4. 使用错误列表窗口查看错误 // 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目 // 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件
右击测试项目,设置为启动项。运行结果如下:
7、静态库和动态库的区别:
静态库:
应用程序代码 +静态库代码——》可执行程序.exe
A.exe(含有静态库M) B.exe(含有静态库M), 二者都含有各自静态库的拷贝
动态库:
在编译时只有少量的符号信息会打包包可执行程序.exe中,主要的程序代码会独立编程成一个dll文件。
多个应用程序可公享一个动态库.dll文件。
动态库可实现运行时的动态加载,还可以被第三方程序所调用(下个博客讲述)