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文件。

动态库可实现运行时的动态加载,还可以被第三方程序所调用(下个博客讲述)

经验分享 程序员 微信小程序 职场和发展