LINUX动态链接库的创建与使用?
对于动态链接库来说,程序的可执行文件当中会留有一个它的标记,当程序运行到相应的标记的时候,就会调用相应的动态库。由于动态库节省空间,所以一般linux下面链接程序的时候都是默认的按照动态方式链接的。
cpp文件是怎么变成可执行文件的?动态链接库又是什么呢?
1.cpp是编译产生2进制代码,这个2进制代码就是exe
2.qt库就是一大堆已经写好的函数,跟你引用
3.makefile是用来帮助计算机编译C源文件的。在linux里面比较常用,告诉了计算机,要编译我的C源文件,需要什么版本的编译器,需要什么包,什么头文件,如果不满足就提示,如果满足就编译,还记录了C源文件的位置(因为不止一个),编译之后放到哪。等等。
4.静态链接库是lib,在编译的时候,将里面的代码直接写入exe中,随身带。
dll因为里面东西比较通用,一般电脑都有,所以在用的时候从系统里面拿就行。于是就不写这部分了,只标记在哪个dll里面。
qtcreator怎么加载大量windows下的动态库?
.pro文件管理,所以库文件要在.pro文件中添加。
1.添加库文件静态库 linux:LIBS+=your_lib_path/your_lib动态库 linux:LIBS+=-Lyour_lib_path-lyour_lib//经过测试了 win32:LIBS+=your_lib_path/your_lib例如: LIBS+=-Llib/pcsc/-lpcsclite LIBS+=lib/pcsc/libpcsclite.a
2.添加头文件 INCLUDEPATH+=your_include_path例如: INCLUDEPATH+=./usr/local/include(点号后面有空格)
3.添加要编译的源文件和头文件 SOURCES:所有源文件列表 HEADERS:所有头文件列表 FORMS:所有.ui文件列表前期工作: 1.检查gcc,g++,qmake是否用错。 2.在Makefile中检查是否少了头文件 3.检查是否与<错用了
4.需要另外加库的程序最好单独建一个文件
如何查看linux动态库中包含哪些函数?
主要有两种方法,如下:
1、方法1 nm *.so
2、方法2 readelf -a *.so
说明:
nm可列出.o .a .so中的符号信息,包括诸如符号的值,符号类型及符号名称等。所谓符号,通常指定义出的函数,全局变量等等。
示例说明 :
nm -D libname.so
nm
有用的options:
-A 在每个符号信息的前面打印所在对象文件名称;
-C 输出demangle过了的符号名称;
-D 打印动态符号;
-l 使用对象文件中的调试信息打印出所在源文件及行号;
-n 按照地址/符号值来排序;
-u 打印出那些未定义的符号;
如何在linux平台生成静态链接库与动态链接库?
动态库和静态库
在Win下,动态库以.dll结尾,静态库以.lib结尾。
在Linux下,动态库文件以.so结尾,静态库以.a结尾。
在Mac下,动态库以.dylib结尾,静态库以.a结尾。
动态库的优势和劣势
动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。 动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。
某个程序在运行时要调用某个动态链接库函数的时候,OS首先查看所有正在运行的进程,找找看是否已经有人载入了这个库。如果有的话,直接用。如果没有才会载入。这样的第一个优点就是节省内存空间。动态调入意味着是等需要的时候才调入内存,而不是不管用不用都要先放到内存里来。
我如果想要升级某个软件。如果升级的位置是在dll里,那软件其他的部位不需要重新编译链接。所以升级方便。
静态库的优势和劣势
利用静态函数库编译成的文件比较大,因为整个函数库在编译时都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果你静态链接的函数库改变了,那么你的程序必须重新编译。
代码更精简,因为不必做版本检查。
程序分发时文件个数少,因为静态链接到源文件里了。
只编译进来库中所用的部分,而不用整个库。
生成的binary占空间更大。
重复的库可能出现在多个进程,浪费内存。
库内部更新的话需要重新编译binary。
Linux平台的静态库
静态库的生成
静态库的链接
Linux平台的动态库
动态库的生成
动态库的链接
Windows平台的静态库
静态库的生成/MT 使用 LIBCMT.lib 编译以创建多线程可执行文件。 生成静态库lib。r 静态库的链接
1、在使用链接库的代码开头加入,第二行是要调用的链接库里的函数:
2、将要调用的链接库的lib放入项目源代码中,然后编译。(编译的时候不需要dll。这里把静态部分lib编译进了exe,但动态库dll还没用。)
3、运行之前要把dll放到exe目录下。
Windows平台的动态库
动态库的生成/MD 使用 MSVCRT.lib 编译以创建多线程 DLL。生成动态库。r 动态库的链接
1、 LoadLibrary(或MFC 的AfxLoadLibrary),装载动态库。
2、 GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。
3、 FreeLibrary(或MFC的AfxFreeLibrary),释放动态链接库。