c语⾔将程序写为动态库,VS下⽣成C程序静态库(LIB)及动
态库(DLL)的⽅法
⼀、前⾔
⼯作中有时候因为分⼯合作的原因需要让别⼈调⽤⾃⼰写的代码去完成某项功能,但是⼜不想让别⼈看到具体的实现过程,只是提供⼀个API形式的接⼝供别⼈调⽤;⼜或者是其他的⼀些原因,有必要学习静态库及动态库的相关知识,本⽂⼤多数内容均为参考⽹上资料后的整理,作为学习的总结。
⼆、DLL与LIB⽂件的区别
lib是⼀个⼆进制⽂件,与dll类似,供其他程序调⽤。lib与dll的区别是:dll是运⾏时需要的,lib是编译时需要的。
1、共有两种库:七夕节是哪天
(1)⼀种是LIB包含了函数所在的DLL⽂件和⽂件中函数位置的信息(⼊⼝),代码由运⾏时加载在进程空间中的DLL提供,称为动态链接 库dynamic link library。
(2)⼀种是LIB包含函数代码本⾝,在编译时直接将代码加⼊程序当中,称为静态链接库static link library。
2、共有两种链接⽅式:
(1)动态链接使⽤动态链接库,允许可执⾏模块(.dll⽂件或.exe⽂件)仅包含在运⾏时定 位DLL函数的可执⾏代码所需的信息。
(2)静态链接使⽤静态链接库,链接器从静态链接库LIB获取所有被引⽤函数,并将库同代码⼀起放到可执⾏⽂件 中。
3、关于lib和dll的区别如下:
(1)lib是编译时⽤到的,dll是运⾏时⽤到的。如果要完成源代码的编译,只需要 lib;如果要使动态链接的程序运⾏起来,只需要dll。
(2)如果有dll⽂件,那么lib⼀般是⼀些索引信息,记录了dll中函数的⼊⼝和位 置,dll中是函数的具体内容;如果只有lib⽂件,那么这个lib ⽂件是静态编译出来的,索引和实现都在其中。使⽤静态编译的lib⽂件,在运⾏程序时 不需要再挂动态库,缺点是导致应⽤程序⽐较⼤,⽽且失去了动态库的灵活性,发布新版本时要发布新的应⽤程序才⾏。
(3)动态链接的情况下,有两个⽂件:⼀个是LIB⽂件,⼀个是DLL⽂件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应⽤程序使⽤LIB⽂件链接到DLL ⽂件。在应⽤程序的可执⾏⽂件中,存放的不是被调⽤的函数代码,⽽是DLL中相应函数代码的地址,从⽽节省了内存资源。DLL和LIB⽂件必须随应⽤程序 ⼀起发⾏,否则应⽤程序会产⽣错误。如果不想⽤lib⽂件或者没有lib⽂件,可以⽤WIN32 API函数LoadLibrary、GetProcAddress装载。
4、使⽤lib需注意两个⽂件:
(1).h头⽂件,包含 lib中说明输出的类或符号原型或数据结构。应⽤程序调⽤lib时,需要将该⽂件包含⼊应⽤程序的源⽂件中。
(2).LIB⽂件,略。
三国志12 技法5、使⽤dll需注意三个⽂件:
(1).h头⽂件,包含dll中说明输出的类或符号原型或数据结构的.h⽂件。应⽤程序调⽤dll时,需要将该⽂件包含 ⼊应⽤程序的源⽂件中。
(2).LIB⽂件,是dll在编译、链接成功之后⽣成的⽂件,作⽤是当其他应⽤程序调⽤dll时,需要将该⽂件引⼊应⽤ 程序,否则产⽣错误。如果不想⽤lib⽂件或者没有lib⽂件,可以⽤WIN32 API函数LoadLi
brary、GetProcAddress装载。
(3).dll⽂件,真正的可执⾏⽂件,开发成功后的应⽤ 程序在发布时,只需要有.exe⽂件和.dll⽂件,并不需要.lib⽂件和.h头⽂件。
三、VS下⽣成静态库(LIB)
毛尖属于什么茶新建VS2010项⽬,注意选择Win32项⽬,⽽不是MFC DLL项⽬。MFC DLL 和win32 DLL的差别就是⼀个使⽤MFC类库,⼀个不使⽤如果你代码中⽤到了MFC,那么⼀定要创建MFC DLL,因为win32 DLL⽤不了MFC类。
下⼀步,最好不要选预编译选项!选预编译头的话,就在.cpp⽂件中添加 #include "StdAfx.h"
然后添加进来.h和.cpp⽂件,就可以直接点⽣成解决⽅案了。别点调试,因为没有⼊⼝函数。这⾥要注意你⽣成lib的项⽬配置属性要和你使⽤此lib的项⽬配置属性要保持⼀致 。将.h⽂件和⽣成的lib⽂件拷到你的项⽬中并添加,就可以使⽤了。
若出现错误error LNK2005: ___xi_a 已经在 msvcrt.lib(cinitexe.obj) 中定义,解决办法:属性::C++::运⾏时库,确保该项⽬和所引⽤的所有的库都是相同的选项,如release版本时都选择"多线程dll"。
四、VS下⽣成动态库(DLL)
韵母有哪些字母1、⽣成
(1)⽂件——新建——项⽬,选择如下图
(2)新建头⽂件test.h和源⽂件test.c
//test.h
__declspec(dllexport) int sum(int a, int b); //test.c
#include "test.h"
#include
8823住宿网int sum(int a, int b) {
return a + b;
}
(3)右击项⽬选择⽣成,在debug中会产⽣多个⽂件,我们只需要dllgen.dll和dllgen.lib
2、使⽤
(1)⽂件——新建——项⽬——空项⽬
(2)将dllgen⼯程中的test.h、dllgen.dll、dllgen.lib拷贝到当前⼯程下
(3)在⼯程中添加test.h,同时新建main.c
//main.c
风筝鲁迅#include "test.h"
#include
#include
#pragma comment(lib,"dllgen.lib")
void main() {
int n;
n = sum(10, 6);
printf("10 + 6 = %d\n",n);
system("pause");
}
(4)运⾏项⽬,查看测试结果
五、加载lib/头⽂件和DLL的⽅法
1、加载lib/头⽂件
(1)适⽤于当前项⽬
1 第⼀步:项⽬->属性->C/C++->常规->附加包含⽬录(浏览.h⽂件的路径) 添加包含⽂件。
2 第⼆步:项⽬->属性->C/C++->链接器->输⼊->附加依赖项(写⼊lib的名称) 添加库⽂件。
3 项⽬->属性->C/C++->链接器->输⼊->附加依赖项,添加⽤到的lib 。
4 第三步:在要使⽤cpp⽂件前加⼊ #include (注意⽂件的路径)。
(这⼀步也可以在代码中显⽰调⽤ #pragma comment(lib, "***.lib") )(若不添加,连接报错:⽆法解析的外部符号)。
(2)适⽤于所有项⽬,设置好后即使重建新项⽬也不需重新设置。
1 Tools->Options->Projects and Solutions->VC++ Directories ->Show directories for:(选择include files)->添加.h路径
2 Tools->Options->Projects and Solutions->VC++ Directories ->Show directories for:(选择Library files)->添加lib路径(这些路径只告诉编译器怎么⽂件,没有说把那⾥⾯的⽂件加⼊⼯程.)
(若不设置,编译报错:⽆法打开***⽂件)。
2、加载DLL
将dll⽂件拷贝到⼯程debug⽂件下(如果不拷贝,编译链接不报错,运⾏报错:⽆法到***.dll)。
六、参考⽂章地址:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论