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 ctypes

a = 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.mfbz.cn/a/171257.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基础课10——自然语言生成

自然语言生成是让计算机自动或半自动地生成自然语言的文本。这个领域涉及到自然语言处理、语言学、计算机科学等多个领域的知识。 1.简介 自然语言生成系统可以分为基于规则的方法和基于统计的方法两大类。基于规则的方法主要依靠专家知识库和语言学规则来生成文本&#xff0…

java中的抽象

1.当一个类中给出的信息不够全面时&#xff0c;&#xff08;比方说有无法确定的行为&#xff09;&#xff0c;它给出的信息不足以描绘出一个具体的对象&#xff0c;这时我们往往不会实例化该类&#xff0c;这种类就是抽象类。 2. 在Java中&#xff0c;我们通过在类前添加关键字…

Redis篇---第九篇

系列文章目录 文章目录 系列文章目录前言一、如果有大量的 key 需要设置同一时间过期,一般需要注意什么?二、什么情况下可能会导致 Redis 阻塞?三、缓存和数据库谁先更新呢?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击…

南京--ChatGPT/GPT4 科研实践应用

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

MySQL 数据库下载

1 最新版 MySQL :: Download MySQL Community Server 2 存档版本(Archived Versions)-历史版本 MySQL :: Download MySQL Community Server (Archived Versions) 3 下载(样例: zip 方式) tip1&#xff1a; 可以下载安装文件的方式&#xff0c;也可以使用压缩包方式&#xff…

Git详解

Git是一个开源的分布式版本控制系统&#xff0c;常用于软件开发中对代码版本管理。Git具有版本控制、协作开发、分支管理、代码审查等功能&#xff0c;能够记录每次代码修改的内容和时间&#xff0c;并能够回滚到任意历史版本&#xff0c;方便团队协作和代码维护。 Git的基本概…

腾讯云5年服务器2核4G和4核8G配置租用价格表

腾讯云百科整理五年云服务器优惠活动 txybk.com/go/txy 配置可选2核4G和4核8G&#xff0c;公网带宽可选1M、3M或5M&#xff0c;系统盘为50G高性能云硬盘&#xff0c;标准型S5实例CPU采用主频2.5GHz的Intel Xeon Cascade Lake或者Intel Xeon Cooper Lake处理器&#xff0c;睿频3…

SQL 中的 NULL 值:定义、测试和处理空数据,以及 SQL UPDATE 语句的使用

SQL NULL 值 什么是 NULL 值&#xff1f; NULL 值是指字段没有值的情况。如果表中的字段是可选的&#xff0c;那么可以插入新记录或更新记录而不向该字段添加值。此时&#xff0c;该字段将保存为 NULL 值。需要注意的是&#xff0c;NULL 值与零值或包含空格的字段不同。具有 …

大数据Doris(二十五):Stream Load数据导入演示和其他导入案例

文章目录 数据导入演示和其他导入案例 一、数据导入演示

万字解析设计模式之 装饰者模式

一、装饰者模式 1.1概述 装饰者模式是一种结构型设计模式&#xff0c;它允许在运行时动态地为一个对象添加额外的职责。它以一种透明的方式来扩展对象的功能&#xff0c;而不需要通过子类来实现。在装饰者模式中&#xff0c;有一个基本对象&#xff0c;也称为组件&#xff0c;…

2023年亚太杯数学建模思路 - 案例:感知机原理剖析及实现

文章目录 1 感知机的直观理解2 感知机的数学角度3 代码实现 4 建模资料 # 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 感知机的直观理解 感知机应该属于机器学习算法中最简单的一种算法&#xff0c;其…

鸿蒙原生应用/元服务开发-AGC分发如何编译打包应用

软件包规范 在正式打包应用前&#xff0c;请确保已了解HarmonyOS应用软件包规范。 操作步骤 1.打开DevEco Studio&#xff0c;菜单选择“Build > Build Hap(s)/APP(s) > Build APP(s)”。 2.等待编译构建。编译完成后&#xff0c;将在工程目录“build > outputs >…

Vue2问题:分享一个通用多文件类型预览库

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约2000字&#xff0c;整篇阅读大约需要3分钟。 本文主要内容分三部分&#xff0c;第一部分是需求分析&#xff0c;第二部分是实现步骤&#xff0c;第三部分是问题详解。 …

一文详看大模型长文本如何评估:四大主流评测数据集的任务设计、数据集构建方案

大语言模型&#xff08;LLM&#xff09;尽管在各种语言任务中表现抢眼&#xff0c;但通常仅限于处理上下文窗口大小范围内的文本。 有越来越多的基准被提出来测试LLM的长文本理解能力。 当前具有代表性的长文本评测主要包括Zero-SCROLLS、L-Eval、LongBench以及loogle四个基准…

Ansys Lumerical|菲涅尔透镜设计

附件下载 联系工作人员获取附件 在这个例子中&#xff0c;我们研究一个球面菲涅尔透镜。透镜的曲率半径为100cm&#xff0c;直径为4.8cm。由于该结构的尺寸较大&#xff0c;我们必须使用该结构的二维近似。透镜的焦点可以用FDTD远场投影函数来研究。 镜头设计和设置 我们将考…

希亦ACE和RUUFFY内衣洗衣机选哪个好?内衣洗衣机大对比

这两年&#xff0c;内衣洗衣机算是一种很受欢迎的小家电了&#xff0c;尽管它的体积很小&#xff0c;但是它的作用很大&#xff0c;一键就能启动洗、漂、脱三种自动操作&#xff0c;在提高多功能和性能的同时&#xff0c;也能让我们在洗衣服的时候&#xff0c;解放了我们的手。…

Spring Boot 与 Gzip 压缩

响应压缩是 Web 应用一种常见的优化手段&#xff0c;通过压缩算法减小传输数据的体积&#xff0c;提高传输效率、节约带宽。客户端接收到数据后&#xff0c;使用相同的算法对数据进行解压从而获取到原始数据。 客户端和服务器需要通过 Header 来协商双方支持的压缩算法。 Acc…

迎接“全全闪”时代 星辰天合发布星海架构和星飞产品

11 月 17 日&#xff0c;北京市星辰天合科技股份有限公司&#xff08;简称&#xff1a;XSKY星辰天合&#xff09;在北京首钢园举办了主题为“星星之火”的 XSKY 星海全闪架构暨星飞存储发布会&#xff0c;到场嘉宾共同见证了全新的分布式全闪架构“星海&#xff08;XSEA&#x…

企业办公室信息安全保密办法——推荐用天锐绿盾数据安全防泄密系统 | 防止核心文件数据、资料泄露

天锐绿盾数据安全防泄密系统是一种有效的办公室信息安全保密办法。该系统采用驱动层透明加密技术&#xff0c;对电子文件进行自动加密&#xff0c;保护数据的安全性和隐私性。 PC端访问地址&#xff1a; https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c…

深搜回溯剪枝-全排列

LCR 083. 全排列 - 力扣&#xff08;LeetCode&#xff09; 根据题意&#xff0c;要根据给定的整数数组&#xff0c;穷举出所有可能的排列&#xff0c;从直观的角度上来看&#xff0c;可以使用多层 for 循环来解决&#xff0c;但如果是数组长度太大的时候&#xff0c;这种方式不…
最新文章