您现在的位置是:主页 > news > 网页制作与网站建设 自考/网站维护合同
网页制作与网站建设 自考/网站维护合同
admin2025/4/29 2:34:43【news】
简介网页制作与网站建设 自考,网站维护合同,提交链接,最好的网站建设报价软件库Library之静态库\动态库和静态加载\动态加载 动态库之导入库 https://blog.csdn.net/wallaceli1981/article/details/5740718 * 动态库在开发时仅是把dll中的函数名和参数放到应用程序中,应用程序运行时根据函数名和参数调用dll中的函数来运行,这…
软件库Library之静态库\动态库和静态加载\动态加载
动态库之导入库
https://blog.csdn.net/wallaceli1981/article/details/5740718
* 动态库在开发时仅是把dll中的函数名和参数放到应用程序中,应用程序运行时根据函数名和参数调用dll中的函数来运行,这样操作系统中的应用程序可以同时使用同一个dll。可以有效地节省硬盘空间,当然这样做使得程序设计更有层次。也有利于软件工程师的分工和信息安全
* 动态库以.dl文件形式存在,且一般都有一个对应的引入库以.lib文件形式存在。纯资源dll不生成.lib引入库。
>引入库和静态库的扩展名均为*.lib,但是引入库仅包含一些函数名和参数信息,没有函数体,是为调用动态库服务的,它和动态库的关系相当于.h文件和.cpp文件之间的关系;
* 动态库两种绑定方式
>静态绑定(static blnding) 使用静态绑定的程序在一开始载入内存的时候,载入程序就会把程序所有调用到的动态代码的地址算出、确定下来。这种方式使程序刚运行时的初始化时间较长,不过一但完成动态装载,程序的运行速度就很快。
>动态绑定(dynamic binding) 使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程序又需要调用另外某块动态代码时,载入程序才又去计算这部分代码的逻辑地址。所以,这种方式侄程序初始化时间较短,但运行期间的性能比不上静态绑定的程序。
2. 在项目中使用动态库的方法:
方法一: 隐式加载: 这种方式和静态库的使用方法一样,对应有3种具体的方法,注意此时要包含的是导入库而不是动态库,依然需要头文件,代码中可直接使用头文件中的函数名,并且这种方式在运行时需要需要动态库。
方法二: 显式加载(又称运行时动态链接):在代码中使用LoadLibrary()显式打开dll文件,使用GetProcAddress获取函数地址然后使用,使用完之后用FreeLibrary显式释放dll文件。这种方式不需要导入库及.h文件。
使用隐式加载时,如果进程在启动时未找到dll,则操作系统将终止此进程。但使用显式加载时则进程不会被终止。
---------------------
Linux下动态库两种调用加载方式总结
https://blog.csdn.net/shaosunrise/article/details/81161064
方式1使用头文件,所以可以直接调用头文件声明的函数。编译的时候指定了动态库位置和名称,程序启动时候系统就会自动加载相应位置的so动态库。
方式2没有头文件,编译的时候也不需要指定动态库信息。但是需要在程序中使用dlopen函数加载相应位置的so动态库,且要使用dlsym函数根据函数符号去查找此函数的地址。
Windows下动态库的动态加载和静态加载
https://blog.csdn.net/wallaceli1981/article/details/5740718
使用动态库的两种方法(windows)
>方法一: load-time dynamic linking
在要调用dll的应用程序链接时,将dll的输入库文件(import library,.lib文件)包含进去。具体的做 法是在源文件开头加一句#include ,然后就可以在源文件中调用dlldemo.dll中的输出文件了。
>方法二: run-time dynamic linking
不必在链接时包含输入库文件,而是在源程序中使用LoadLibrary或LoadLibraryEx动态的载入dll。
---------------------
https://blog.csdn.net/CNHK1225/article/details/51952662
动态库的动态加载方式调用,里面定义的数据结构理论上只作为dll内部使用!在这种情况下,如果这个dll的导出函数参数有内部定义的数据类型,显然是违反低耦合性原则的,实际上这种情况下编写dll方应该提供.h、.lib和.dll文件给使用者的,即你不能以动态库的动态加载方式调用,而是以动态库的静态加载方式调用!
换句话说,一般的只提供dll和导出函数文档这种情况,其dll中的导出函数参数列表都应该是基础数据类型,而不应带有内部的自定义结构,当然,带内部定义数据机构参数的函数,也应该是内部函数,不做导出用。
要想使用dll里定义的数据结构,必须要有头文件的,或者你自己定义一个同名的数据结构,但是这种情况下你得知道那个数据结构的组成
总之,对于dll的编写者和使用者,双方必须要有明确的需求,以何种方式使用,决定着dll的编写规则,也决定着使用规则.....
---------------------
linux动态库与静态库混合连接
https://www.cnblogs.com/bigben0123/p/3304863.html
1, 在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库。使用方式为:
gcc test.cpp -L. -ltestlib
如果当前目录有两个库libtestlib.so libtestlib.a 则肯定是连接libtestlib.so。如果要指定为连接静态库则使用:
gcc test.cpp -L. -static -ltestlib
使用静态库进行连接。
2, 当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式。这时需要作用-Wl的方式:
gcc test.cpp -L. -Wl,-Bstatic -ltestlib -Wl,-Bdynamic -ltestlib
3, 另外还要注意系统的运行库使用动态连接的方式,所以当动态库在静态库前面连接时,必须在命令行最后使用动态连接的命令才能正常连接
,如:
gcc test.cpp -L. -Wl,-Bdynamic -ltestlib -Wl,-Bstatic -ltestlib -Wl,-Bdynamic
1、使用GCC创建和使用静态库
(1)gcc –o mylib.o –c mylib.c //生成o文件
(2)ar -rcs libmylib.a mylib.o //生成a文件
-c create的意思
-r replace的意思,表示当插入的模块名已经在库中存在,则替换同名的模块。
(3)cp libmylib.a /usr/lib/ //拷贝到默认目录
(4)编写程序使用库中的函数,需要包含相关的头文件,即可用下面的方式进行编译连接。
gcc –o test test.c -L. -lmylib
-L指定静态函数库的位置供查找,注意L后面还有'.',表示静态函数库在本目录下查找。
-l则指定了静态函数库名,由于静态函数库的命名方式是lib***.a,其中的lib和.a忽略。
2、使用GCC创建和使用动态库
(1)gcc –fPIC –o mylib.o –c mylib.c
gcc –shared –o libtt.so mylib.o
-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
-shared 作用于链接阶段,实际传递给链接器ld,让其添加作为共享库所需要的额外描述信息,去除共享库所不需的信息。
(2)也可以直接使用下面一条命令:
gcc –fPIC –shared –o libtt.so mylib.c
(3)将动态库拷贝到linux 的标准库中,usr/local/lib 或者/usr/lib 或者/lib,使用ldconfig命令加载
cp libttt.so /usr/local/lib
(4) 编译src 程序使用动态库,隐式调用方法: 在编译调用库函数代码时指明动态库的位置及名字
gcc –o test test.c ./usr/lib/libttt.so
(5)编译src程序使用动态库,显示调用方法
显式调用动态库需要四个函数的支持, 函数 dlopen 打开动态库, 函数 dlsym 获取动态库中对象基址, 函数 dlerror 获取显式动态库操作中的错误信息, 函数 doclose 关闭动态库.
#include <dlfcn.h> int main() { void *pHandle; void (*pFunc)(); // 指向函数的指针 int *p; pHandle = dlopen("./d1.so", RTLD_NOW); // 打开动态库 if(!pHandle){ printf("Can't find d1.so \n"); exit(1); } pFunc = (void (*)())dlsym(pHandle, "print"); // 获取库函数 print 的地址 if(pFunc) pFunc(); else printf("Can't find function print\n"); dlclose(pHandle); // 关闭动态库 return 0; } |
gcc –o test test.c -lttt -L
此时会到系统目录下去搜素libttt.so文件,具体搜索方法见下一节。
3、shell 搜索动态库路径位置的两种方法
(1) 使用命令导入动态库的路径,命令如下:
export LD_LIBRARY_PATH=dir (如/usr/local/lib)
(2) 在/etc/ld.so.conf 文件中更增加一条,修改后用ldconfig 命令载入修改。
4、其他
(1)ldd命令可以查看一个可执行程序依赖的共享库,
# ldd /bin/ln
=> /lib/libc.so.6 (0×40021000)/lib/ld-linux.so.2
=> /lib/ld- linux.so.2 (0×40000000)
可以看到ln命令依赖于libc库和ld-linux库
(2)看动态库包含哪些定义用:
nm -D lib*.so
(3)当生成动态库时,源文件又引用其他静态库,需要一起写。这时源文件里面不用用extern f();,这样就不能引入静态库。需要直接#include 头文件。
比如,gcc -fexceptions -O2 -o hello.node ./build/Release/obj.target/hello/hello.o ./libpanda.a /usr/local/lib/libnfc.a -shared -fPIC
参考:
gcc生成静态库和动态库: http://blog.csdn.net/ast_224/article/details/3988244
动态库(.so)链接静态库(.a)的情况总结:
http://www.cnblogs.com/nobugtodebug/archive/2012/11/07/e6cd72c67b3dd843f40d7ce919f7336a.html
http://www.cppblog.com/deane/archive/2014/05/23/165216.html