动态库编程详解

嵌入式--UC编程--总结回顾1 UC高级编程 UC简介 Unix系统下C开发-使用Unix/Linux的系统函数开发 静态库和共享库 环境变量和环境表 Unix/Linux的内存管理 编译工具 gcc -c —编译但不连接,生产.o文件 gcc -S —汇编,生产.s文件 gcc -E —只做预处理 gcc -o —改变生产的文件的名字 gcc—编译工具集合 gcc编译C程序—预处理、编译、汇编、链接 预处理,针... 阅读详情

 

目录

概述

一、动态库概念与分类

1、什么是动态库

2、动态库分类

4、动态库解决的问题

二、动态库的创建

1、规则动态库

2、声明导出函数的两种方式

2.1__declspec(dllexport)导出

2.2 .def文件导出

3、导出导入类

三、隐式、显示调用动态库

1、动态库隐式调用

2、动态库显示调用

3.显示、隐式调用的区别

四、动态库的测试

 

 

 

概述

      动态库是继静态库发展起来的一种封装重用技术,在灵活性、扩展性、重用性各方面取得了突破,本文只介绍动态库的基础知识,关于动态库的高级编程,推荐参看Jeffrey Reichter与Chiristophe Nasarre合著的《Windows核心编程》第5版。

      

一、动态库概念与分类

1、什么是动态库

   DLL(Dynamic Linkable Library)动态链接库亦简称动态库,它是一块封装好的代码块,包含着一些方法,一般不包括消息循环,也建议不要去包含这些。可把它看成一个仓库,其提供了可直接使用的变量、函数、类等。打个不太生动的比喻,动态库犹如保卫森严的生产基地,但你可以通过正确入口进入,获得你想要的东西,你不用管也管不着这东西是怎么生产的,拿走从出口出来就行,同时生产基地是共享的,大家都可以通过入口获得相应的东西。

      在“库”的发展史上经历了“无库---静态库---动态库”的时代,无论是动态库还是静态库都能解决代码共享的问题。

动态库是基于二进制级重用的,所以与语言无关、环境无关(前提是你动态库中没有涉及对环境有依赖的东西,如调用一些第三方DLL等)的,再一个得遵循DLL接口规范和调用约定,简而言之,用各种语言编写的标准DLL其他语言都可以调用。所以如果想创建一个通用的DLL,那么得严格遵守DLL规范,包括导出、调用约定、形参几方面的内容。

 

2、动态库分类 

通过VC++工具编写的动态库分为两类----规则DLL与非规则动态库,Visual C++支持编写三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。

4、动态库解决的问题

      节省资源:如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。

      节省内存,假如本地有多个进程用到动态库,那么在内存只是只载入一次的,两个进程共用该DLL在内存中的页面。

灵活性:我认为灵活性才是动态库最值得称道的地方,发行的动态库,只要原有的接口不改变,那么你可以任意地改动,增加动态库里面的内容,同时以新版本替换旧版本,而不影响依赖于此动态库的程序。举个例子吧,例如你的一个软件已经发行了,如果出了什么问题,只要找出出问题的模块(假如它就是个动态库),并处理好,把新版的动态库给用户替换旧版的就OK了,如果全是静态库呢?那只有把整个工程编译一编,发一个大包给人家,人家也许还要把以前的软件卸载,重新装一次新的版本。

模块化:这对大项目特别有利,利用动态库可以把项目切割成N个小块加以分工,还有利于错误定位等,岂不快哉。

语言无关性:只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL其他语言都可以相互调用。

特殊用途:windows提供的一些特性只有通过DLL才用使用,如钩子(hook)就需要通过DLL来实现,关于钩子的编程细节,将在后续的博文中详细介绍。

 

二、动态库的创建

1、规则动态库

   以VC++6.0为开发工具,在VC++中创建Win32 Dynamic-Link Library工程,下图中选择第一项,当然也可以选择其他项。

在创建的工程中创建一个头文件MyDll.h与一个CPP文件MyDll.cpp,在头文件与源文件中写入以下代码:

//MyDll.h

#ifndef MYDLLEIPORT

#define MYDLLEIPORT extern "C" __declspec(dllimport)

#endif

MYDLLEIPORT int add(int a, int b);

MYDLLEIPORT int     g_nCount;

 

定义实体:

#define MYDLLEIPORT extern "C" __declspec(dllexport)

#include "MyDll.h"

int g_nCount = 0;

int add(int a, int b){

      return (g_nCount += a + b);

}

代码写完了,现在的工作是怎么把函数导出的问题了,下面分析如何导出函数,与导出的方式。

2、声明导出函数的两种方式

DLL中导出函数的声明有两种方式:一种是在函数声明中加上__declspec(dllexport),调用DLL时配合.lib文件通过__declsped(dllimport)指令导入函数即可,另外一种方式是采用模块定义(.def)文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。

通过修饰符__declspec(dllexport)导出的函数,可能会面临函数名改编的问题,而通过.def文件导出的,将不会有此问题,要导出编译时函数名不会被改编的函数,还有一种方法,就是在DLL源文件中输入以下代码:

#pragma comment(linker, “/export:add=_add@8”)

不过此方法有个麻烦事,你得事先知道函数改篇后的名字是什么,如函数add改编后是_add@8,还有此方法导出的函数名是两个,”add”与”_add@8”,个人建议使用.def文件导出最为方便快捷,省去非常多的麻烦。

      这两种导出方式都会生成一个与Dll同名的.lib文件,此文件在隐式调用时得用。.lib文件只是包含一些导出函数的属性说明信息。

2.1__declspec(dllexport)导出

   在头文件声明函数前加上__declspec(dllexport),如下:

#ifndef MYDLLEIPORT

#define MYDLLEIPORT extern "C" __declspec(dllimport)

#endif

MYDLLEIPORT int add(int a, int b);//导出函数

MYDLLEIPORT int g_nCount;//导出变量

其中extern"C"表示函数是安C语言的方式编译,C++对函数名称编译时会改编如add,C++编译后变成_add@8,改名后,C语言或者其他语言调用的时候会出现问题,会找不到,同时不同厂家的编译器编译时生成的函数名也可能不一样; __declspec(dllexport)是导出修饰符,指明导出此函数,不用过分解释,照用就行;下面是对extern "C"的解释:

extern "C"包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的,表示可被外部文件引擎;其次,被它修饰的目标是“C”的,表示按照C语言方式编译和连接。

编译规范(extern "C")必须指定,才能编译出规范的DLL接口。用这个方法导出接口,如果用VC++编译,还是会有函数名改编的问题,编译后,函数名应该是_add@8,调用DLL时,如果用同一厂家(VC++)编译器,是不是会有问题的,用其他厂家的编译器,那就不能保证了,所以这种导出方法并不是很好,可采用下面介绍的通过.def文件导出的方法。

2.2 .def文件导出

      此方法导出函数,将避免函数名改编的问题。在工程中添加一.def文件---MyDll.def:

在新加入的MyDll.def文件中输入以下代码:

;MyDll.def :导出DLL函数

LIBRARY DLLDemo

EXPORTS

add @ 1

g_nCount DATA

.def文件的规则为:
  (1)LIBRARY语句说明.def文件相应的DLL;
  (2)EXPORTS语句后列出要导出函数的名称或者变量。可以在.def文件中的导出函数

名后加@n,表示要导出函数的序号为n,在进行函数调用时,这个序号将发挥其作用,

可通过序号来调用相应的函数(通过序号取得函数方法:GetProcAddress(hDll,

MAKEINTRESOURCE(1))),不过此方法不推荐,因为难以维护之类的原因,现在基本

上不怎么使用;
  (3).def文件中的注释由每个注释行开始处的分号(;)指定,且注释不能与语句共享一行。

      (4)导出全局变量格式:全局变量DATA,DATA是关键字,例:g_nCount DATA

其实也可简单地写成如下格式:

EXPORTS

add

g_nCount DATA

不需要序号,只给个函数名就OK,记住别把函数名弄错了。

 

3、导出导入类

   最好不要导出类,类的导出会破坏DLL的通用性,C++写的类,C#或者其他语言不一定支持,在这里只是简单的说一下。

//文件名:point.h,point类的声明
#ifndef   POINT_H
#define  POINT_H
#ifdef  DLL_FILE
 class _declspec(dllexport) point //导出类point
#else
 class _declspec(dllimport) point //导入类point
#endif
{
 public:
  float y;
  float x;
  point();
  point(float x_coordinate, float y_coordinate);
};

#endif

此处有宏POINT_H、DLL_FILE,第一个宏的作用当然是防止头文件重编译,第二个宏则是用来判断当前是用来导出还是导入的,在此头的实现文件(.cpp)中先对DLL_FILE定义,则导出此文件,而当用户用这个动态库时,因为不知道DLL_FILE,所以自然没定义,则会导入此文件。
//文件名:point.cpp,point类的实现
#ifndef DLL_FILE
 #define DLL_FILE
#endif
#include "point.h"
//
类point的缺省构造函数
point::point()
{
 x = 0.0;
 y = 0.0;
}

类的导出导入看似乎不适合动态调用,因为要包含其头文件,在主调应用程序中生成对象。注意类的导出导入格式如下:

class _declspec(dllexport) 类名 //导出类point
    class _declspec(dllimport) 类名 //导入类point

三、隐式、显示调用动态库

1、动态库隐式调用

   隐式调用也有通过指令与通过IDE设置两种方式。隐式调用需要.lib文件,把.dll与.lib放同一目录下,然后按以下方法操作

Ø 用#pragma comment指令:

      #include “..\MyDll.h”----可以是绝对路径,也以的相对路径

      #pragma comment(lib, “..\\DllDemo.lib”) ----可以是绝对路径,也可以是相对路径

这种方法似乎有点麻烦,必须把路径设对了,不然可能就找不到。

Ø 在编译器(VC)中设置:

1、依次选择tools->options->directories->Show directories for->Library files然后

添加DllDemo.lib的路径。

2、依次选择tools->options->directories->Show directories for->Include files然后选择

MyDll.h的头文件的路径。

      3、依次选择Proctect->Setting->Link然后在Object/library modules中添加上自定义

.lib库(DllDemo.lib)。

      4、使用自定义库中的函数的时候#include “MyLib.h”就可以了。

示例代码:

#include "..\\MyDll.h"

#pragma comment(lib, "..\\Debug\\DLLDemo.lib")

int nResutl = add(1, 2);//直接调用

2、动态库显示调用

   显示调用,不需要头文件,也不需要.lib库文件,随时载入随时释放,比较灵活。

查看动态库信息的工具:

VC++的安装目录下的Depends工具,可以看到动态库的接口信息。

显式调用:

显示调用首先得知道Dll的路径,然后通过API(LoadLibrary)装载DLL,获得DLL的句柄,通过API(GetProcAddress)配合LoadLibrary返回的句柄再找到想要调用的函数的地址(返回的是指向对应函数地址的指针),通过函数指针就可以调用函数了。就是这么简单,以下是方法:

//定义函数指针类型,用以调用动态库中函数,以下是定义函数指针类型的格式:

//typedef [返回类型] (__stdcall *[指针名])(形参);

typedef int (* PADD)(int, int); //定义指针类型
int main(int argc, char *argv[])
{  HINSTANCE hDll; //DLL
句柄
  PADD addFun; //函数指针

HINSTANCE hInstance = LoadLibrary(".\\DllDemo.dll");
  if (hInstance != NULL) {     

      addFun = (PADD)GetProcAddress(hInstance, "add");//获得函数地址

      int nResult = pAdd(1, 6);  //通过函数指针调用函数

      int *pCount = (int *)GetProcAddress(hInstance, "g_nCount");//获得全局变量指针

      int nCount = *pCount;

FreeLibrary(hInstance );                //记得释放哦
 }
 return 0;
}

显示调用与隐式调用却有较大差异,下面我们来逐一分析。
  首先,语句typedef int ( * lpAddFun)(int,int)定义了一个与add函数接受参数类型和返回值均相同的函数指针类型。随后,在main函数中定义了lpAddFun的实例addFun;

  其次,在函数main中定义了一个DLL HINSTANCE句柄实例hInstance,通过Win32 Api函数LoadLibrary动态加载了DLL模块并将DLL模块句柄赋给了hDll;

  再次,在函数main中通过Win32 Api函数GetProcAddress得到了所加载DLL模块中函数add的地址并赋给了addFun。经由函数指针addFun进行了对DLL中add函数的调用;

  最后,应用工程使用完DLL后,在函数main中通过Win32 Api函数FreeLibrary释放了已经加载的DLL模块。

      注:如果是用.def文件定义的导出函数,并为函数给定的序号,则可用以下方法调用函数被调用的方法,GetProcAddress(hDll, MAKEINTRESOURCE(1))

 

3.显示、隐式调用的区别

   从使用层面上讲,隐式调用方便,载入一次(主进程启动的时候载入),就可以到处使用,而显示调用则麻烦些,得载入释放,还有取得相应函数的地址之类。然而显示调用灵活,节省空间,因为使用时才载入,而不用时释放,同时显示调用不需要.lib库之类。

 

四、动态库的测试

   动态库写好之后,如何测试呢,在这介绍一种比较简单的方法,在动态库的工程中,按F5将出现以下界面:

意思是动态库是不能单独运行的,你得给它配一个主进程调用它,所以可以写一个简单的程序按上面调用动态库的方法调用动态库中想要测试的函数,编译通过后把exe文件的路径设置在上图的输入框中,点确定之后,再按F5,这时主进程就启动了,你在主进程中触发调用动态库函数的操作,这时将跳进动态库的工程中,动态库的工程处于调试状态,你可以一步一步跟踪,这样就能很好地测试动态库,并找出bug。

配套源码下载:http://download.youkuaiyun.com/detail/mingojiang/4475172

 

转载请注明出自:http://blog.youkuaiyun.com/mingojiang

 

【C++动态库编程】C++名称改编、标准C接口、extern “C“、函数调用约定以及def文件详解 本文通过一个具体的dll动态库编程实例,详细讲述动态库导出接口相关的导入导出声明、标准C接口、extern "C"作用、函数调用约定声明、跨语言调用dll接口以及def文件等内容。 阅读详情

相关推荐

dll 动态库编程 | C++名称改编、标准C接口、extern “C”、函数调用约定以及def文件详解

dll 动态库编程 | C++名称改编、标准C接口、extern “C”、函数调用约定以及def文件详解

dvlinker的技术专栏 1万+

一文彻底搞懂静态库和动态库,显示链接和隐式链接

定义:运行时库 静态库 动态库运行时库:Unix中一个典型的运行时库例子就是libc,它包含标准的C函数,如,print(),exit()等等,用户能创建他们自己的运行库(在Windows...

yolo模型训练找我,AI游戏合作找我 2796

国网698协议接口动态库及说明

文档秘密:8281@3225

【Linux系统编程】Linux动态库详解

所谓“程序库”,简单说,就是包含了数据和执行码的文件。其不能单独执行,可以作为其它执行程序的一部分来完成某些功能。库的存在可以使得程序模块化,可以加快程序的再编译,可以实现代码重用,可以使得程序便于升级。程序库可分静态库(static library)和共享库(shared library)。不管是Linux还是Windows中的库文件其本质和工作模式都是相同的, 只不过在不同的平台上库对应的文件格式和文件后缀不同。程序中调用的库有两种静态库和动态库。

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 3682

单片机如何获得5V电源

在单片机实际设计中,有时会需要在电路中用到5V电压源,那么这个常见的实验需求有哪些办法解决呢,我综合网上的资料,概括一下: 1)USB    这种方法在我们直接将单片机板与电脑连接调试的时候,算是简单又方便的办法了,但如果我所要得到的成品不直接连接外部的器件,这就得舍弃。     常用的,USB/5V插头线,这是一种专门的电源线,一端是USB通用接口,可以直插USB端口,另一端是内正外负电压

Echo_Ana的博客 3万+

基于ZYNQ7020芯片(黑金开发板AX7020)之AXI-FULL DDR的PL与PS交互操作。

在该工程中我们使用了PS端的串口接收功能,PS端串口接收和发送分别有一个64字节的FIFO,但是因为串口接收阈值设置为16,所以固定接收16个字节数据后才会发生中断。此测试工程得到以前知识的总结和各大网友的支持,只希望可以为学习的你更进一步,大家一起学习才是真的开心。加油,国产芯片之路。

landyjzlai的博客 3189

__declspec用法详解

__declspec用法详解   __declspec用于指定所给定类型的实例的与Microsoft相关的存储方式。其它的有关存储方式的修饰符如static与extern等是C和 C++语言的ANSI规范,而__declspec是一种扩展属性的定义。扩展属性语法简化并标准化了C和C++语言关于Microsoft的扩展。 用法:__declspec ( extended-decl-modif

shuixin536的专栏 949

QCC308x/3095收发一体:TX/RX双模一拖二与多编码广播实战解析

本文深度解析高通QCC308x/3095蓝牙音频芯片的TX/RX双模功能与广播应用。芯片支持发射和接收模式下的“一拖二”连接,并能实现LE Audio多设备广播,显著提升多设备音频切换体验与商业广播能力,适用于健身、导览等丰富场景。

g9h0i1的博客 1003

动态链接库和静态链接库

如果我们想把我们的某一个功能给别人用但是不想让别人知道我的源码时,我们可以把obj文件和头文件复制给别人用。但是当我们功能比较多,一堆obj比较麻烦,这时候就出现了静态库,将obj集合在一起。3将DLL和LIB文件拷贝到工程目录下,最好在工程的DEBUG目录下也拷贝一份。:如果很多工程使用,就要拷贝很多份.lib文件,这些lib都是一样的。:如果.lib更新,使用的工程如需更新,则必须重新编译。导入直接将lib和dll放入项目下,导入lib文件即可。a方式一:项目>>属性>>链接>>依赖项>>lib名称。

qq_31812157的博客 286

【C语言】程序员筑基功法——《函数栈帧的创建与销毁》

汇编角度带你走进函数栈帧

StackFrame 3656

第78篇:AI辅助创意与设计工作流——Logo、海报、UI的自动化生成与迭代(操作教程)

在广告公司和设计团队摸爬滚打几年,我见过太多设计师为一个Logo的配色、一张海报的版式反复修改到深夜。自从AI绘画工具爆发,我就一直在琢磨,怎么把这些“黑科技”真正塞进设计师的日常流水线里,而不是让它们仅仅是个玩具。今天要聊的,就是一套我实践下来,能真正提升效率的AI辅助创意与设计工作流。我们不谈颠覆,只谈增效——如何用AI快速完成Logo、海报、UI的灵感生成、批量出图与智能迭代,把设计师从重复劳动中解放出来,聚焦在真正的创意决策上。

weixin_37464284的博客 536

在程序中链接静态库 和 动态库

【代码】在程序中链接静态库 和 动态库。

呵呵哒!的博客 1345

北斗导航 | ILS(仪表着陆系统)、MLS(微波着陆系统)和GBAS(地基增强系统)的性能对比

最 早 的 GBAS 系 统 是 **局 域 增 强 系 统(LAAS)**,它是 1990 年由美国 Honeywell 公司 和 NASA 共 同 完 成 的 差 分 GPS(DGPS)演 变 而 来 的。1998 年,LAAS 被 ICAO 采 纳为 GBAS。2009 年 9 月 3 日 Honeywell 公 司 的GBAS 系统通过了 **CAT-I 精密进近着陆系统**的设计认证 ,而 **CAT-II 和 CAT-III 系统的研发和验证工作也正在有序的进行中**

尘世冰封的专栏 3983

【Windows系统编程】04.动态库与静态库(详解远线程注入dll)-笔记

静态链接库的使用,动态链接库的使用,详解远线程注入ShellCode

WdIg-2023的博客 336

YOLOv8改进 | 融合篇,YOLOv8改进主干网络为MobileNetV3+CA注意机制+添加小目标检测层(全网独家首发,实现极限涨点)

小目标检测难点众多,导致很多算法对小目标的检测效果远不如大中型目标。影响算法性能的主要原因如下:第一,小目标分辨率低、信息量不足,导致神经网络提取到的有效特征较少。第二,小目标在图像中所占的区域较小,易受背景干扰,这对算法的定位性能要求较高。第三,小物体标注困难,训练数据有限,导致模型泛化能力差。例如多尺度学习、无锚机制和生成对抗学习等方法,都能提高小目标检测的准确性和鲁棒性。为了改善小目标漏检现象严重的问题,我在 YOLOv8 中增加了 P2 检测头,相当于有四个检测头,使网络能检测到更小的目标。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2857

自动权重化图卷积网络(Auto-Weighted GCN)算法在反洗钱识别中的应用及代码实现

该算法通过自动学习节点之间的权重信息,能够更好地捕捉AML数据中的关系和结构,从而提高反洗钱识别的准确性和效果。传统的AML识别方法通常依赖于专家定义的规则和手动提取的特征,但这些方法在应对大规模和复杂的数据时存在一定的局限性。GCN通过在图上执行卷积操作来捕捉节点之间的关系和结构信息,从而实现对图数据的学习和表示。自动权重化图卷积网络是一种基于GCN的改进算法,能够自动学习节点之间的权重信息,从而更好地捕捉图中的关系。利用自动计算的权重值执行图卷积操作。根据节点之间的相似度,计算每个节点的权重。

syntax_api860的博客 376

linux库概念及相关编程(面试重点)

linux库概念及相关编程(面试重点) 1.分文件编程案例 好处: 分模块的编程思想 网络 a 超声波b 电机c a.功能责任划分 b.方便调试 c.主程序简洁 例如有一个test.c的c程序文件,里面代码只有主程序和相关函数得到调用,而将一些封装好的函数放在test1.c,test.2内,再将其内代码复制一份,然后只留函数的申明,并做成“.h”文件,并在主函数加入此头文件,编译时gcc test.c test1.c test2.c就可以生成可执行c程序了。 2.库 使用GNU的工具我们如何在Linux下创

weixin_48264057的博客 182

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Win32编程

文章目录前言一、VS编译过程二、WIN32核心库1.动态库2.头文件三、入口函数调用约定 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、VS编译过程 源文件(*.c / *.cpp) --> 编译器(cl.exe) --> 目标文件(*.obj) 资源文件(*.rc) -- > 资源编译器(rc.exe) --

流云落尘 785

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Shell 编程与文件 IO 实战:从 Makefile 到静态/动态库(srvA)

摘要: 本文通过学生成绩管理程序 stu_mgr 和计算器库 libcalc 的实战,展示了 Linux 下 C 工程开发的核心技术。Makefile 利用 -MMD -MP 实现依赖追踪,确保头文件修改后仅重编相关源文件。静态库(.a)将代码直接嵌入可执行文件(ldd 不可见),而动态库(.so)在运行时加载(需指定 RUNPATH)。迷你 Shell minishell 通过 fork+execvp 机制实现内建命令与外部命令的混合执行,验证了递归文件操作和进程创建原理。这些技术构成了 Linux 系统

cpyaxjq的博客 187

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

HTTP服务器项目1:Linux系统编程入门

HTTP服务器项目1:Linux系统编程入门 1:Linux开发环境的搭建: 完成这个项目用到的开发环境为: ubuntu18.04 VSCode xshell/Mobaxterm 如果需要软件和镜像,可以在文章末尾进行提取。 2:GCC编译工具: 01 / 什么是GCC: ◼ GCC 原名为 GNU C语言编译器(GNU C Compiler) ◼ GCC(GNU Compiler Collection,GNU编译器套件)是由 GNU 开发的编程语言 译器。GNU 编译器套件包括 C、C++、Obje

哒宰的博客 3061

Linux_基础编程day02

将近日学习Linux基础编程,系统编程,网络编程的word笔记搬运过来,图片无法直接粘贴,就丢失掉了。日后工作学习中使用与扩充维护还是word笔记。基础编程day02内容简介:学习目标:1 掌握vim命令模式下相关命令的使用2 从命令模式切换到编辑模式 3 末行模式4 gcc工作流程掌握常见参数的使用5 linux下静态库的制作和使用6 linux下动态库的制作和使用内容简介:         软...

scavenger1994的博客 255

零基础入门rust-plus-golang:从动态库到静态库的完整实践教程

rust-plus-golang是一个实用的开源项目,它展示了如何通过结合cgo和Rust的FFI能力,实现在Go语言中调用Rust代码。本教程将为零基础用户提供从动态库到静态库的完整实践指南,帮助你轻松掌握这一跨语言调用技术。 ## 为什么选择rust-plus-golang? 在软件开发中,不同语言各有优势。Rust以其内存安全和高性能著称,而Go则以简洁的语法和强大的并发能力受到青睐。r

gitblog_01103的博客 852

VS2022跨平台汇编开发:x86/x64双架构动态库调用实战指南

本文详细介绍了在VS2022中实现x86/x64双架构动态库调用的实战指南,涵盖环境搭建、多平台配置、汇编环境设置及常见问题排查。通过具体示例和优化建议,帮助开发者高效处理32位与64位汇编动态库的兼容性问题,提升跨平台开发效率。

gamma的博客 147

【Win32】初识Win32编程

补发:发表于2021-11-08 忘了同步到优快云上了 链接 Windows编程 应用程序分类 控制台程序Console DOS程序,本身没有窗口,通过Windows DOS窗口执行。(DOS是操作系统预留的) 窗口程序 拥有自己的窗口,可以与用户交互。 库程序 存放代码、数据的程序、执行文件可以从中取出代码执行和获取数据 静态库程序:扩展名LIB,在编译链接程序时,将代码放入到执行文件中。 动态库程序:扩展名DLL,在执行文件时从中获取代码 。 静态库中的代码是直接嵌入到你的项目

半生瓜のblog 7313

12.【Linux系统编程】动静态库制作与使用

本文介绍了库的基本概念和两种类型(静态库和动态库)的生成与使用方法。静态库在编译时链接到可执行文件中,而动态库在程序运行时加载。文章详细说明了两种库的生成流程:静态库通过ar命令打包.o文件,动态库通过gcc命令生成位置无关码。同时介绍了三种不同路径下库的使用方法,包括指定头文件和库文件路径的方式。最后指出了动态库运行时搜索路径的问题及其解决方法。通过具体示例和Makefile脚本,完整展示了库的开发和使用流程。

恢弘志士之气,不宜妄自菲薄 696
上一篇: 带技术团队之大忌
下一篇: 智能交通监管平台
MingoJiang
博客等级 码龄14年 161粉丝 41原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MingoJiang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值