C语言生成dll与lib文件

环境要求

新建一个空白项目,可以是exe的,也可以直接是dll的,也可以是啥都没有的空项目,推荐创建空项目,项目创建好以后进行配置,共两步

第一步,打开项目属性
在这里插入图片描述
第二步,设置配置类型为动态库dll,并确定
在这里插入图片描述

编写dll库函数

test1.c

_declspec(dllexport) int test(int a, int b)
{return a + b + b;
}

test1.h

#pragma once
_declspec(dllexport) int test(int a, int b);

test2.c

_declspec(dllexport) int minus(int a, int b)
{return a - b;
}

test2.h

#pragma once
_declspec(dllexport) int minus(int a, int b);

常见问题和错误说明

声明,下述结论以测试工程为例: 1. 编写dll库不需要main函数,直接写函数即可,参考工程见下图1;2. 生成的dll文件保存路径如下:H:\Test\x64\Debug;3. 生成成功的标志(图2),只要输出窗口中显示1成功即可,不用理会白色的报错;4. 如果输出窗口中没有字(图3),那么前往 H:\Test\x64\Debug;把里面所有文件删了再重新编译运行即OK;5. 如果上述都不行,那么点击  生成 --> 重新生成解决方案;6. 编写函数时,一定要加上 _declspec(dllexport) ,不然dll文件可以正常生成,但是Python读取不了;7. 只写.c文件,不写.h文件,生成的dll文件python一样可以调用,不建议这么干;8. lib和dll文件详细说明后附;9. 加上 _declspec(dllexport) ,会生成 lib 文件和 dll 文件,不加只会生成dll文件;10. 如果工程下存在多个.c和.h文件,里面都存放了函数,随便点哪里编译运行即可,生成的dll文件会包含所有.c的函数;11. 无法看到dll文件中有哪些函数,想看的话可以通过小工具 dll  export viewer;12. 有时候头文件中会通过 extern "C" _declspec(dllexport) int minus(int a, int b); 来创建函数,是因为如果按照C的方式来创建,在dll经过编译器后函数名不会变,否则会被编译器修饰,例如C++调用dll时。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Python调用dll文件

Python调用dll时,只需要dll文件
import ctypesa = ctypes.CDLL('Test.dll')
ret = a.test(1,2)
ret1 = a.miuns(1,2)print(ret, ret1)

C语言调用dll文件

  1. 静态调用

     1. 静态调用需要lib文件和dll文件,在程序一开始执行时就加载这个文件。2. 在调用前,先把lib和dll拷贝到当前工程文件夹,不然提示找不到dll,见下图。3. 在下面示例中,我没有声明 test 函数,但是它依然可以正常调用,是因为C会假设它存在,并执行相应操作,但是这种方式不可以取,在调用时,还是显式声明一下。
    

在这里插入图片描述

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>#pragma  comment(lib, "H://Test//x64//Debug//Test.lib")		// 通过关键字导入静态文件路径	
_declspec(dllimport) int minus(int a, int b);				// 声明导入函数,注意这里是import
int main() {int a = minus(5, 6);int b = test(5, 6);printf("%d", a);printf("%d", b);
}
  1. 动态调用

     1. 动态调用是比较常用的一种方法。2. dll文件可以通过直接指定路径的方式来添加。3. 动态调用是什么时候用dll,什么时候再加载dll。4. 流程: 实例一个句柄 --> 创建指向函数地址的指针 --> 获取函数入口地址 --> 使用函数
    
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>int main()
{HINSTANCE h = LoadLibrary(L"H://Test//x64//Debug//Test.dll");	// 实例化句柄 typedef int (*p_func)(int a, int b);							// 创建一个指向函数地址的指针p_func testfunc = (p_func)GetProcAddress(h, "test");			// 获取函数入口地址int a = testfunc(5, 6);printf("%d", a);return 0;
}

dll和lib的详细介绍

lib 分为两种

  1. 第一种包含了函数所在的dll文件和文件中函数入口,具体的代码由运行时dll来提供。
  2. 第二种时lib包含了代码本身,在编译时直接把代码加入到程序中。

区别

  1. lib是编译时才用,dll是运行时才用。
  2. 完成源代码编译只需lib,程序要跑起来需要用到dll。
  3. 如果存在dll文件,那么lib中一般是一些索引信息,记录函数的入口和位置,dll中是具体内容。
  4. 如果只有lib,那么这个lib是静态编译出来的,索引和代码都在里面。
  5. 如果使用静态编译的lib,那么编译时程序会全部加载到项目中,会使应用程序超级大,并且失去了动态库的灵活性,发布新版本需要发布新的应用程序。
  6. 如果不想使用lib文件,可以同win32 API提供的Loadbriary,GetProcAddress来直接调用dll。

注意事项

  1. 头文件中包含lib中说明输出的符号和数据结构,应用程序调用lib时,需要将头文件包含进去。
  2. 包含了dll中说明输出的符号和数据结构的.h文件,应用程序调用dll时,应该将.h文件引入应用程序的源文件中。
    开发成功后的应用程序在发布时,只需要.exe和.dll文件,并不需要.lib和.h文件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/155722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Python处理ADC激光测距数据并绘制为图片(二)

使用Python处理ADC激光测距数据并绘制为图片 说明一、定义全局变量变二、保存和清空原始数据三、拆分原始数据为键值对四、获取标题、FigText、更新统计信息文件五、生成图片六、处理原始数据文件七、主函数入口八、测试结果 说明 1. 主要是将ADC激光测距叠加后的1024Byte数据绘…

哪个才是最适合你的 Web UI 自动化测试框架

最近&#xff0c;项目上出于系统性稳定性、减少测试工作量考虑&#xff0c;打算在 Web 前端引入 BDD。由于上一个项目写了一定的 Cucumber 代码&#xff08;BDD 测试框架之一&#xff09;&#xff0c;这个框架选型的责任便落到了我的肩膀上了。 在我们进行框架选型的时候&#…

【SA8295P 源码分析 (三)】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算

【SA8295P 源码分析】132 - GMSL2 协议分析 之 GPIO/SPI/I2C/UART 等通迅控制协议带宽消耗计算 一、GPIO 透传带宽消耗计算二、SPI 通迅带宽消耗计算三、I2C 通迅带宽消耗计算四、UART 通迅带宽消耗计算系列文章汇总见:《【SA8295P 源码分析 (三)】Camera 模块 文章链接汇总 -…

如何做好前端单元测试?字节5年测试老司机是这样说的!

近几年&#xff0c;前端发展越来越迅猛&#xff0c;各类框架层出不穷&#xff0c;前端实现的业务逻辑也越来越复杂&#xff0c;前端单元测试也越来越受重视&#xff0c;包括百度在内的一些大厂在面试中也会问到单元测试相关的题目。那么前端应该如何做好单元测试&#xff1f; 什…

安全知识普及:了解端点检测与响应 (EDR)对企业的重要性

文章目录 EDR 的含义和定义EDR 是如何运作的&#xff1f;收集端点数据将数据发送到 EDR 平台分析数据标记可疑活动并做出响应保留数据以供日后使用 为什么 EDR 对企业至关重要大多数企业都有可能遭受各种网络攻击。有些攻击可以完全绕开企业的防御远程办公让员工缺乏足够的保护…

杨氏矩阵解法

每日一言 「 人生如逆旅&#xff0c;我亦是行人。 」--临江仙送钱穆父-苏轼题目 杨氏矩阵 有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 解法思路 法一&#xff1a;…

三字经||无聊数了下三字经的字数

三字经总字数去除标点后1416个 该文章无技术含量&#xff0c;仅三字经原文&#xff0c;学技术的同学可以止步了 三字经&#xff08;原文&#xff09; 【作者】王应麟 【朝代】南宋 人之初&#xff0c;性本善。性相近&#xff0c;习相远。 苟不教&#xff0c;性乃迁。教之道&a…

基于知识问答的上下文学习中的代码风格11.20

基于知识问答的上下文学习中的代码风格 摘要1 引言2 相关工作3 方法3.1 概述3.2 元函数设计3.3 推理 4 实验4.1 实验设置4.2 实施细节4.3 主要结果 摘要 现有的基于知识的问题分类方法通常依赖于复杂的训练技术和模型框架&#xff0c;在实际应用中存在诸多局限性。最近&#x…

泵类设备常见的5种故障及监测方法

在各种工业领域中&#xff0c;泵是一种关键设备&#xff0c;用于输送液体或气体。然而&#xff0c;泵类设备常常会面临各种故障&#xff0c;这可能导致生产停顿和生产效率下降。为了及时监测并解决这些故障&#xff0c;设备状态监测系统成为一种重要的工具。本文将介绍泵类设备…

Pytorch torch.norm函数详解用法

torch.norm参数定义 torch版本1.6 def norm(input, p"fro", dimNone, keepdimFalse, outNone, dtypeNone)input input (Tensor): the input tensor 输入为tensorp p (int, float, inf, -inf, fro, nuc, optional): the order of norm. Default: froThe following …

零代码编程:用ChatGPT将SRT字幕文件批量转为Word文本文档

一个文件夹中有多个srt视频字幕文件&#xff0c;srt文件里面有很多时间轴&#xff1a; 现在想将其批量转为word文档&#xff0c;去掉里面与字符无关的时间轴&#xff0c;在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个批量将SRT字幕文件转为…

js 数组中使用 push 报错

文章目录 问题分析 问题 代码如下&#xff0c;但报错如上&#xff0c;请分析上述代码错误原因 let arr [[160, 20], [179, 10], [-170, -20]]; let temp arr.unshift([1,1]); let tt temp.push([0,0])console.log(tt); // 输出新生成的数组分析 这段代码有几个错误&#x…

opencv-形态学处理

通过阈值化分割可以得到二值图&#xff0c;但往往会出现图像中物体形态不完整&#xff0c;变的残缺&#xff0c;可以通过形态学处理&#xff0c;使其变得丰满&#xff0c;或者去除掉多余的像素。常用的形态学处理算法包括&#xff1a;腐蚀&#xff0c;膨胀&#xff0c;开运算&a…

【设计模式】结构型设计模式

结构型设计模式 文章目录 结构型设计模式一、概述二、适配器模式&#xff08;Adapter Pattern&#xff09;2.1 类适配器模式2.2 对象适配器模式2.3 接口适配器模式2.4 小结 三、桥接模式&#xff08;Bridge Pattern&#xff09;四、装饰器模式&#xff08;Decorator Pattern&am…

基于ubuntu20.04安装ros系统搭配使用工业相机

基于ubuntu20.04安装ros系统搭配使用工业相机 1. ROS系统安装部署1.1更新镜像源1.1.1 备份源文件1.1.2 更新阿里源1.1.3 更新软件源 1.2 ros系统安装1.2.1 添加ros软件源1.2.2 添加秘钥1.2.3 更新软件源1.2.4 配置及更换最佳软件源1.2.5 ROS安装1.2.6 初始化rosdep1.2.7 设置环…

datagrip只导出表结构

话不多说&#xff0c;直接上教程。 datagrip版本&#xff1a;2022.3 第一步&#xff0c;连接数据库 第二步&#xff0c;右击数据库&#xff0c;复制即可

【20年扬大真题】编写对数组求逆的递归算法

【20年扬大真题】 编写对数组求逆的递归算法 void swap(int* a, int* b) {int tmp *b;*b *a;*a tmp; } void Ni(int arr[],int left,int right) {if (left > right) {return;}swap(&arr[left], &arr[right]);Ni(arr, left 1, right - 1); } int main() {int ar…

详解Python安装requests库的实例代码

文章目录 前言基本用法基本的get请求带参数的GET请求解析json关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战案例③Python小游戏源码五、面试资料六、Python兼职渠道 前…

“茶叶创新:爆改营销策略,三个月狂销2300万“

我的朋友去年制作了一款白茶&#xff0c;并在短短三个月内将其销售量推到了2300万的高峰。你相信吗&#xff1f; 这位朋友并没有任何茶叶方面的经验&#xff0c;他只是一个有着冒险精神的企业家。他先找到了一家代工厂&#xff0c;帮助他把他的茶叶理念转化为现实。 当他把茶叶…