上篇文章演示了如何使用C++ 编译的静态链接库和动态链接库,本篇文章主要介绍如何创建静态链接库和动态链接库,本文使用的工具是visual studio 2019 企业版,需要安装对应的C++sdk,可以参考网上其他文章,本问不在赘述。

一、创建静态链接库

使用VS 2019 创建C++ 静态链接库,新建项目,选择 C++ 静态库

删除多余的.h以及.cpp文件,添加TestAdd.h,以及TestAdd.cpp文件,如图所示

TestAdd.h,以及TestAdd.cpp文件内容如下:

#pragma once
//extern "C" __declspec(dllexport) int __stdcall sumA(int a, int b);
//extern "C" __declspec(dllexport) int __stdcall minusA(int a, int b);__declspec(dllexport) int sumA(int a, int b);
__declspec(dllexport) int minusA(int a, int b);
//#define DLLEXPORT extern "C" __declspec(dllexport)
//
//DLLEXPORT int sumA(int a, int b)
//{
//    return a + b;
//}
//
//DLLEXPORT int minusA(int a, int b)
//{
//    return a - b;
//}__declspec(dllexport)int sumA(int a, int b)
{return a + b;
}int minusA(int a, int b)
{return a - b;
}//
//__declspec(dllexport) int sumA(int a, int b);
//__declspec(dllexport) int minusA(int a, int b);

上述TestAdd.h,以及TestAdd.cpp文件创建以后,选择项目,右键属性,配置属性 C/C++ 预编译头 中预编译头,选择 不使用预编译头,然后应用,确定。

选择项目编译生成,即可上生成TestStaticLib.lib

其他地方使用的时候需要复制TestStaticLib.lib和头文件TestAdd.h即可使用,使用方式有三种,哪一种都可以使用TestStaticLib.lib中的方法接口,如下:

首先在需要引用静态库的项目中引用头文件TestAdd.h,代码 :#include “TestAdd.h”,如项目A引用静态库,即在项目A的.cpp中添加#include “TestAdd.h”即可,下面以项目A来展示。

1、常规引用静态库

选择项目A,右键属性 配置属性 链接器  输入  附加依赖项,选择.lib的 静态库的位置即可,.cpp的代码中直接使用TestStaticLib.lib中的方法接口即可

2、选择项目A中的资源文件,添加TestStaticLib.lib静态库,.cpp的代码中直接使用TestStaticLib.lib中的方法接口即可

3、.cpp的代码中首先添加如下代码,,之后下面直接使用TestStaticLib.lib中的方法接口即可

//语句:#pragma comment(lib,"TestStaticLib.lib"),可以替代手动链接lib文件,显示加载链接库。
      #pragma comment(lib,"TestStaticLib.lib")

二、创建动态链接库

使用VS 2019 创建C++ 动态链接库,新建项目,选择 C++ 动态库

添加Add.h,以及Add.cpp文件,如图所示

Add.h,以及Add.cpp文件内容如下:

#pragma once
extern "C" __declspec(dllexport) int __stdcall sum(int a, int b);
extern "C" __declspec(dllexport) int __stdcall minus(int a, int b);
#define DLLEXPORT extern "C" __declspec(dllexport)DLLEXPORT int sum(int a, int b)
{return a + b;
}DLLEXPORT int minus(int a, int b)
{return a - b;
}

上述Add.h,以及Add.cpp文件创建以后,选择项目,右键属性,配置属性 C/C++ 预编译头 中预编译头,选择 不使用预编译头,然后应用,确定。

 

选择项目编译生成,即可上生成TestDll.dll

其他地方使用的时候需要复制TestDll.dll即可使用,本文以MFC窗体项目使用演示,窗体.cpp文件中添加如下代码:

#include <iostream>#include "windows.h"/*
Windows头文件中包含可以加载DLL的函数。---注意要先声明一下对应的指针函数接口
*/
typedef int(*ptrSub)(int, int);
//HMODULE hMod = LoadLibrary(L"TestDll.dll");
//配置属性 高级 高级属性 字符集 使用Unicode字符集 改成  使用多字节字符集 就可以省略 _T以及LoadLibrary(L"TestDll.dll");中的L了,
HMODULE hMod = LoadLibrary("TestDll.dll");
/*
在调用DLL函数之前,要定义函数指针,用来调用函数。
可以看出,函数指针的类型与DLL中的要一致。
*/
//HMODULE hMod = LoadLibrary(L"AdbHelper.dll");
/*调用LoadLibrary函数加载DLL文件。加载成功,hMod指针不为空。这里也可以是一个地址加文件名
*/

窗体.cpp文件中添加2个按钮事件,测试加和减如下代码:

/// <summary>
/// 调用TestDll.dll中的加法函数--sum
/// </summary>
void CMFCWinformAppTestDlg::OnBnClickedButton11()
{if (hMod != NULL){/*如果加载成功,则可通过GetProcAddress函数获取DLL中需要调用的函数的地址。获取成功,sum指针不为空。*/ptrSub sum = (ptrSub)GetProcAddress(hMod, "sum");if (sum != NULL){int a = sum(10, 6);CString temp_value = _T("处理数据:");   //temp_value用来处理float值temp_value.Format(_T("%d"), a);//固定格式//AfxMessageBox("10 - 6 =" + temp_value);CString tempvalue = _T("10 - 6 =" + temp_value);MessageBox(tempvalue, _T("标题"), MB_USERICON | MB_OK);//std::cout << "10 + 6 = " << a << std::endl;/*获取地址成功后,通过sum调用函数功能。*/}//FreeLibrary(hMod);/*在完成调用功能后,不在需要DLL支持,则可以通过FreeLibrary函数释放DLL。*/}
}/// <summary>
/// 调用TestDll.dll中的减法法函数--minus
/// </summary>
void CMFCWinformAppTestDlg::OnBnClickedButton12()
{if (hMod != NULL){/*如果加载成功,则可通过GetProcAddress函数获取DLL中需要调用的函数的地址。获取成功,sum指针不为空。*/ptrSub minus = (ptrSub)GetProcAddress(hMod, "minus");if (minus != NULL){int a = minus(10, 6);CString temp_value = _T("");   //temp_value用来处理float值temp_value.Format(_T("%d"), a);//固定格式//AfxMessageBox("10 - 6 =" + temp_value);CString tempvalue = _T("10 - 6 =" + temp_value);//配置属性 高级 高级属性 字符集 使用Unicode字符集 改成  使用多字节字符集 就可以省略 _T以及LoadLibrary(L"TestDll.dll");中的L了,//CString tempvalue1 = ("10 - 6 =" + temp_value);//tempvalue.GetBuffer();MessageBox(tempvalue, _T("标题"), MB_USERICON | MB_OK);//int result = MessageBox(TEXT("10 - 6 = a"), TEXT("新建任务"), MB_YESNO);//std::cout << "10 - 6 = " << a << std::endl;/*获取地址成功后,通过sum调用函数功能。*/}FreeLibrary(hMod);/*在完成调用功能后,不在需要DLL支持,则可以通过FreeLibrary函数释放DLL。*/}
}

注意事项:

//HMODULE hMod = LoadLibrary(L"TestDll.dll");
//配置属性 高级 高级属性 字符集 使用Unicode字符集 改成 使用多字节字符集 就可以省略 _T以及LoadLibrary(L"TestDll.dll");中的L了,
HMODULE hMod = LoadLibrary("TestDll.dll");

其他语言的引用,如C#代码如下:

namespace HidHelperTest
{class TestDllUtils{[DllImport("TestDll.dll", EntryPoint = "minus")]public extern static int sum(int a, int b);[DllImport("TestDll.dll", EntryPoint = "minus")]public extern static int minus(int a, int b);}
}

使用

 private void btOneMeter_Click(object sender, EventArgs e){int a= TestDllUtils.sum(1, 2);}

C++ 创建静态链接库和动态链接库相关推荐

  1. cnsl是什么意思_VS2010下创建静态链接库和动态链接库

    VS2010下创建静态链接库和动态链接库 类封装成dll如果你的工作长期与某个领域相关,比如说长期做直接体绘制 (DVR)方面的开发,那么你可能经常使用自己的传递函数类,如果每一个工程你都把传递函数类 ...

  2. Linux下的静态链接库和动态链接库编程

    Linux下的静态链接库和动态链接库编程 参考: Linux下的静态链接库和动态链接库编程 - Histring - 博客园 Mac下静态库和动态库的创建和使用_C/C++_vincent2610的专 ...

  3. 静态链接库和动态链接库(转)

    我们可以创建一种文件里面包含了很多函数和变量的目标代码,链接的时候只要把这个文件指示给链接程序就自动地从文件中查找符合要求的函数和变量进行链接,整个查找过程根本不需要我们操心. 这个文件叫做 &quo ...

  4. 静态链接库、动态链接库和动态加载库

    前言 静态库是obj文件的一个集合(目标文件中通常仅解析了文件内部的变量和函数,对于引用的函数和变量还没有解析,这需要将其他已经编写好的目标文件引用进来,将没有解析的函数和变量进行解析,通常引用的目标 ...

  5. UNIX环境高级编程(三)—— 静态链接库与动态链接库

    动态链接库一般不开放源码,需要建工程才能使用(其中提供的接口和 API): 0. .a/.o/.so What are .a and .so files? .o 就相当于 windows 里的 obj ...

  6. 【四、静态库与动态库(共享库)】揭开链接库的神秘面纱:手把手教你制作静态链接库与动态链接库

    前言 不管是在 Windows 下开发,还是在 Linux 下开发,我们都会经常性的使用一些库文件,这些库文件的特点就是,我们可以看到接口的原型并通过这些接口来调用这个函数的功能,但是我们无法查看这个 ...

  7. 静态链接库与动态链接库区别

    一.        静态链接库与动态链接库区别 静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib 中的指令都全部被直接包含在最终生成的 EXE 文件中了.但是若使 ...

  8. 静态链接库与动态链接库详解

    以下内容源于C语言中文网相关内容的学习整理,如有侵权请告知删除. 一.库文件的简介 库文件,其等价为压缩包文件.该文件内部通常包含不止一个目标文件(也就是二进制文件),每个目标文件存储的代码,并非完整 ...

  9. 静态链接库、动态链接库使用方法

    总结一下动态链接库和静态链接库.1 首先搞清楚几个概念: 静态库:函数和数据被编译进一个二进制文件,通常扩展名为.lib.在使用静态库的情况下,在编译连接可执行文件时,链接器从库中复制这些函数和数据并 ...

最新文章

  1. Linux基金会宣布开发区块链技术的新团队
  2. LeetCode -- 3Sum
  3. C语言再学习 -- NUL和NULL的区别
  4. *【CodeForces - 1150D】Three Religions(dp,预处理,思维)
  5. CEF新版发布 添加多项激动人心的新特性
  6. 还不会用springboot写接口?快看这里,手把手操作,一发入魂~
  7. linux下无权限安装anaconda和tensorflow-gpu
  8. 限速访问文件服务器,利用nginx实现文档服务器限速
  9. QT中文乱码深度剖析
  10. 特征提取、特征描述、特征匹配的通俗解释
  11. 自己调用NTDLL函数
  12. librdkafka 封装的C++类
  13. 基于深度学习技术的智能分类垃圾桶设计方案
  14. 用文氏图来理解卷积神经网络如何决定提取哪些特征
  15. Ubuntu16.04安装运行go-ipfs
  16. 2014级学生程序设计学习大数据
  17. 手机回收ATM面世,无人回收会成为下一个风口吗?
  18. Android 蓝色光滤波器(护眼神器) 反编译
  19. HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第5章CSS盒子模型
  20. Flink on yarn集群HA配置

热门文章

  1. 怎么扩大esp分区和传统引导转UEFI引导教程
  2. 150h速成软件工程
  3. Revit族添加数据的方式
  4. layui 表格字体_Layui表格自定义表格字体样式
  5. HBuilder快捷键
  6. 机械键盘检测连击的软件
  7. freetype库的移植
  8. 【全国省市县数据】JAVA导入到树结构表
  9. WiFi吞吐量的测试
  10. 功能机和Andorid 语言支持