开发流程

https://www.runoob.com/w3cnote/cpp-static-library-and-dynamic-library.htmlhtml

lib、dll介绍

静态库:

在连接步骤中,链接器将从库文件取得所需的代码,复制到生成的可执行文件exe中,这种库称为静态库,其特色是可执行文件中包含了库代码的一份完整拷贝;缺点就是被屡次使用就会有多份冗余拷贝。即静态库中的指令都所有被直接包含在最终生成的 EXE 文件中了。在vs中新建生成静态库的工程,编译生成成功后,只产生一个.lib文件ios

lib=>exec++

静态编译\动态编译web

静态库lib编译的时候所有嵌入exe,致使exe会很大安全

动态库:

动态连接库是一个包含可由多个程序同时使用的代码和数据的库,DLL不是可执行文件。动态连接提供了一种方法,使进程能够调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中,该 DLL 包含一个或多个已被编译、连接并与使用它们的进程分开存储的函数。在vs中新建生成动态库的工程,编译成功后,产生一个.lib文件和一个.dll文件。网络

动态库就是动态加载svg

photoshop.exe 113MB函数

动态加载,用的时候连接一下测试

软件升级,连一下网络,替换一下dllcode

静态库和动态库中的lib有什么区别呢?

一、静态库中的lib:该LIB包含函数代码自己(即包括函数的索引,也包括实现),在编译时直接将代码加入程序当中

二、动态库中的lib:该LIB包含了函数所在的DLL文件和文件中函数位置的信息(索引),函数实现代码由运行时加载在进程空间中的DLL提供

总之,lib是编译时用到的,dll是运行时用到的。若是要完成源代码的编译,只须要lib;若是要使动态连接的程序运行起来,只须要dll。

生成和使用静态库lib

​ 一、创建win32项目、空项目、lib文件

创建testlib.h文件 #ifndef TETLIB_H

#define TESTLB_H

//防止头文件重复包含

//条件编译指令

//加减乘除,此处声明想用函数

int add(int a,int b);

int Cheng(int a, int b);

#endif

创建testlib.cpp文件 #include "testlib.h"

//加减乘除

int add(int a, int b)

{

return a + b;

}

int Cheng(int a, int b)

{

return a*b;

}

二、创建win32控制台程序、空项目(最下面的取消勾选)、控制台程序 #include

#include

#include "../testlib/testlib.h" //包含静态库的头文件

#pragma comment(lib, "testlib.lib") //连接静态库

int main()

{

std::cout << "请输入两个整数,计算和" << std::endl;

int a, b;

std::cin >> a >> b;

//调用静态库

std::cout << add(a, b) << std::endl;

std::cout << Cheng(a, b) << std::endl;

return 0;

}

一、包含静态库头文件

二、在链接器-常规-附加库目录,包含lib — 相对路径==…\Debug与$(SolutionDir)Debug同样==

三、#pragma comment(lib, “testlib.lib”) //连接静态库

生成和使用动态库

一、创建win32项目、空项目(不勾选安全开发周期)、dll

创建testdll.h文件 #ifndef TESDLL_H

#define TESDLL_H

//#ifdef和ifndef意思相反

//条件编译指令 若是预处理命令中有_DLLAPI,便执行export输出,不然输入

#ifdef _DLLAPI //**本win32项目下预处理器加入_DLLAPI**//

#define DLLAPI _declspec(dllexport)

#else

#define DLLAPI _declspec(dllimport)

#endif

//声明导出函数

extern "C" DLLAPI int /*DLLAPI*/ add(int a, int b);

//按着C语言的方式编译,函数名称不变,配合Dependency Walker软件使用,能够很

//直观看出来。

#endif

创建testdll.cpp文件 #include "testdll.h"

#include

int add(int a, int b)

{

return a + b;

}

二、创建win32控制台程序、空项目、控制台程序

创建test.cpp文件 #include

#include"../testdll/testdll.h"

//#pragma comment(lib,"testdll.lib")//这不是真的静态库,隐式调用

//导入,不叫导出

DLLAPI int add(int a, int b);

int main()

{

int a, b;

std::cout << "请输入" << std::endl;

std::cin >> a >> b;

std::cout << add(a, b) << std::endl;

return 0;

}

实现流程(隐式调用)

#include"…/testdll/testdll.h"的效果与在VC++目录-包含目录下添加效果一致

lib文件应在链接器-常规-附加库目录添加路径

#pragma comment(lib,“testdll.lib”) 的效果与在连接器-输入-附属依赖项里面加testdll.lib效果一致

==dll的操做:==一、放到exe文件下

​ 二、编写出口和接口包含库.h输出测试文件.cpp接收

//导出

extern "C" DLLAPI int /*DLLAPI*/ add(int a, int b);

//导入,不叫导出

DLLAPI int add(int a, int b);

dll的操做另外一种方式==(可是调用不会搞,调用好像有问题)==

65524986487f4b05952ea508.html

65524986487f4b05952ea508.html

实现流程(显式调用)

了解,通常不经常使用,须要.h和dll,不须要lib

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐