动态库和静态库



1.静态库不需要main函数,要想生成lib,要修改属性à常规à配置类型à改成dll

2.静态库中的头文件只是说明,是给程序员看的,其实lib里面已经有了接口。

3.链接lib的时候程序的体积就变大了。

4.静态库更新的时候,需要重新生成,然后调用

5.动态库调用就不用重新生成。

6.动态库的调用代码:(使用的是HMODULELoadLibraryA的方式进行调用)

接口

7.编写的动态库如下:

#include<stdio.h>

#include<stdlib.h>

#include<Windows.h>

//导出函数,可以加载的时候调用

_declspec(dllexport)
void
msg()

{

MessageBoxA(0, "1",
"2", 0);

}

//导出函数,可以加载的时候调用

_declspec(dllexport)
int 
add(int
a,
int
b)

{

return
a +
b;

}

8.动态库调用代码:

#include
<stdio.h>

#include<stdlib.h>

#include<Windows.h>

typedef
void(*pmsg)();//简化函数指针

typedef
int(*padd)(int
a,
int
b);//简化函数指针

void
main()

{

HMODULE
mydll =
LoadLibraryA("动态库.dll");

if (mydll
== NULL)

{

printf("动态库加载失败");

}

else

{

pmsg
pmsg1;  
//定义一个函数指针,msg为函数名

//获取函数地址

pmsg1 = (pmsg)GetProcAddress(mydll,"msg");

if (pmsg1
!= NULL)

{

pmsg1();//执行

}

padd
padd1;//定义函数指针

padd1 = (padd)GetProcAddress(mydll,
"add");

if (padd1
!= NULL)

{

printf("\n%d",padd1(10,29));

}

}

//如果调用下面的代码之后就可以发现在程序里面没有"动态库.dll"了

FreeLibrary(mydll);

system("pause");

}

9.动态库和静态库的比较

dll(动态库)

谁都可以用,不用更新exe,更新dll即可,可以实现功能更新,节省计算机资源,需要使用的时候调用,否则释放。

lib(静态库)

可以实现库文件的私有,每次更新,需要重新编译exe.

动态库和静态库,布布扣,bubuko.com

时间: 2024-12-14 10:30:48

动态库和静态库的相关文章

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf 动态库的后缀为*.so 静态库的后缀为 libxxx.a ldconfig 目录名

Linux系统中“动态库”和“静态库”那点事儿 /etc/ld.so.conf  动态库的后缀为*.so  静态库的后缀为 libxxx.a   ldconfig   目录名 转载自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格

如何使用Eclipse的NDK开发动态库,静态库

============问题描述============ 如何使用Eclipse的NDK开发动态库,静态库? Eclipse中已经安装了NDK,CDT和Esequoyah并配置(是在网上查的). 我是做C++的,公司业务需要自学Android,对Java也是知道一点皮毛. 在网上查了一些资料,我都没有成功做出最简单的动态库或静态库,郁闷啊! 有没有详细指导? ============解决方案1============ 你去搜一下Android的jni开发,就知道了,一点都不难,不过一般开发ndk

Linux系统中“动态库”和“静态库”那点事儿【转】

转自:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我们主要来说说Linux系统下基于动态库(.so)和静态(.a)的程序那些猫腻.在这之前,我们需要了解一下源代码到可执行程序之间到底发生了什么神奇而美妙的事情. 在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式.ELF(Executable and Linking Format,可执行连接格式)是UNIX系统实验室(USL)作为应用程序二进制

ios 开发中 动态库 与静态库的区别

使用静态库的好处 1,模块化,分工合作 2,避免少量改动经常导致大量的重复编译连接 3,也可以重用,注意不是共享使用 动态库使用有如下好处: 1使用动态库,可以将最终可执行文件体积缩小 2使用动态库,多个应用程序共享内存中得同一份库文件,节省资源 3使用动态库,可以不重新编译连接可执行程序的前提下,更新动态库文件达到更新应用程序的目的. 从1可以得出,将整个应用程序分模块,团队合作,进行分工,影响比较小. 等其他好处, 从2可以看出,其实动态库应该叫共享库,那么从这个意义上来说,苹果禁止iOS开

函数库:静态库和动态库

1.函数库 函数库其实就是一些写好的函数集合,方便别人的复用.实现的封装之后,最终的目的都是给别人调用. 2.库的形式 库的形式分:动态链接库和静态链接库. 优点: (1)库文件都是被编译好的二进制文件,别人看不到源代码,可以保持保密:(2)同时不会因为不小心被修改出现问题,便于维护. LINUX 下的库学习: 静态链接库:.a 文件 其实就是将多函数,做编译但是不链接生成的 .o 文件,使用 ar 工具打包为 .a 的文件.编译的阶段,当调用这些库的时候,链接器就会去 .a 的库文件中拿出被调

VS2008 动态库和静态库的生成和加载

第一:动态库和静态库的生成: 1) 新建一个生成dll工程: 文件->新建->项目->Win32->Win32控制台应用程序 输入项目名称:dllTest ,项目路径:D:\VC 确定 下一步 应用程序类型:选择DLL 完成 2) 编写代码: 2-1) 增加一个头文件:dllTest.h #define ICILIB_UTIL_API __declspec(dllexport)  //生成动态库时,同时在Debug或Release目录下生成.lib和.dll文件. class IC

linux动态库与静态库使用比较

在windows下,动态库dll的使用往往伴随着lib的指引,而linux使用动态库和静态库则有较大的不同. linux静态库和动态库的区别 1. 静态库 名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,编译后的执行程序不需要外部的函数库支持,但是,升级比较麻烦.每一次版本更新都需要重新编译. 2. 动态库 名字一般是libxxx.so;动态库没有被编译进最终程序,只有在需要的时候,动态加载到内存中.编译后的程序不包含动态库部分,程

运行时库以及静态库,动态库之间的关系

了解篇 http://www.cnblogs.com/renyuan/p/5031100.html 知道MT,MD之间的不同,MT会将LIBC.LIB或者LIBCMT.LIB打包进可执行程序, 而MD则告诉可执行程序,运行的时候调用msvcrt.dll,因此任何一个工程 只能选择运行时库中的一种方式,MD,MDd,MT,MTd,这四种方式的一种, 连接C库,不管是一个静态库,还是一个动态库,还是一个可执行程序, 链接的其他库的时候,都必须保持一致,否则就会出现如下的提示: 错误 LNK2038

解决遇到动态库链接静态库

场景: 二进制Link-->动态库-->第三方静态库 Linux环境中需要动态库链接第三方的静态库 错误: /usr/bin/ld: ../../3rdpart/x64/muduo/lib/libbase.a(AsyncLogging.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC ../../3rdpart/x64/mu