动态库

linux内存管理

大兔子大兔子 提交于 2019-11-28 22:44:20
在linux下,使用top,vmstat,free等命令查看系统或者进程的内存使用情况时,经常看到buff/cache memeory,swap,avail Mem等,他们都代表什么意思呢?这篇文章将来聊一聊Linux下的内存管理并解答这个问题。 讨论Linux下的内存管理其实就是讨论Linux下虚拟内存的实现方式,本人不是内核专家,所以这篇文章只会介绍一些概念性的东西,不会深入实现细节,有些地方描述的有可能不精确。 在早些时候,物理内存比较有限,人们希望程序可以使用的内存空间能超过实际物理内存,于是出现了虚拟内存的概念,不过随着时间的推移,虚拟内存的意义已经远远的超过了最初的想法。 1、虚拟内存 虚拟内存是Linux管理内存的一种技术。它使得每个应用程序都认为自己拥有独立且连续的可用的内存空间(一段连续完整的地址空间),而实际上,它通常是被映射到多个物理内存段,还有部分暂时存储在外部磁盘存储器上,在需要时再加载到内存中来。 每个进程所能使用的虚拟地址大小和CPU位数有关,在32位的系统上,虚拟地址空间大小是4G,在64位系统上,是2^64=?(算不过来了)。而实际的物理内存可能远远小于虚拟地址空间的大小。 虚拟地址和进程息息相关,不同进程里的同一个虚拟地址指向的物理地址不一定一样,所以离开进程谈虚拟地址没有任何意义。 注意 : 网上很多文章将虚拟内存等同于交换空间

kernel源码分析

落花浮王杯 提交于 2019-11-28 19:24:54
精贴: https://blog.csdn.net/haidao2009/article/details/9470295 (十一)洞悉linux下的Netfilter&iptables:iptables命令行工具源码解析【上】 分类: LINUX 2012-05-25 18:05:05 预备知识: part1: 初见getopt_long() 在分析iptables源码时,作为命令解析的核心函数getopt_long()不得不提。随便百度或google搜索关于该函数的介绍有很多例子和解释,这里我只举一例,目的是让大家了解传递给iptables命令的每个参数是如何被正确识别并处理的。 getopt_long(int argc ,char * const argv [],const char * optstring ,const struct option * longopts ,int * longindex ) 参数说明: argc 和 argv 来自main函数的输入; optstring :表示可以接受的参数。可以是下列值:1.单个字符,表示选项;2.单个字符后接一个冒号“:”表示该选项后必须跟一个参数。参数紧跟在选项后或者以空格隔开,该参数的指针赋给optarg。3.单个字符后跟两个冒号,表示该选项后必须跟一个参数。参数必须紧跟在选项后不能以空格隔开

6-Qt5创建C++动态库DLL

只愿长相守 提交于 2019-11-28 18:17:09
6-Qt5创建C++动态库DLL 为提高代码复用性,实现模块化开发,我们通常会对一些常用函数进行封装,通过调用共享库库的方法实现,Qt自身便能构建共享库,本教程以构建动态链接库为例进行讲解。 1. Qt新建共享库工程 新建工程,选择动态库,命名为 DynamicLibrary ,实现一个简单的方法(method): int test() int test() { qDebug()<<"Hello, Qt5!"<<endl; int sum=0; for (int i=1; i<=100; i++) { sum = sum + i; } qDebug() << sum << endl; return sum; } 可以知道编译输出命令为: g++ -shared -Wl,-subsystem,windows -mthreads -Wl,--out-implib,debug\libDynamicLibrary.a -o debug\DynamicLibrary.dll debug/dynamiclibrary.o D:\Applications\Qt5.12.4\5.12.4\mingw73_64\lib\libQt5Cored.a 得到共享库 DynamicLibrary.dll , 2. Qt调用动态库 新建一个控制台工程 LoadDynamic ,用于测试调用前面构建的动态库

链接静态库

瘦欲@ 提交于 2019-11-28 17:35:49
在应用程序需要连接外部库的情况下,linux默认对库的连接是使用动态库,在找不到动态库的情况下再选择静态库。使用方式为: gcc test.cpp -L. -ltestlib 如果当前目录有两个库libtestlib.so libtestlib.a 则肯定是连接libtestlib.so。如果要指定为连接静态库则使用: gcc test.cpp -L. -static -ltestlib 使用静态库进行连接。 当对动态库与静态库混合连接的时候,使用-static会导致所有的库都使用静态连接的方式。这时需要作用-Wl的方式: gcc test.cpp -L. -Wl,-Bstatic -ltestlib -Wl,-Bdynamic -ltestdll 另外还要注意系统的运行库使用动态连接的方式,所以当动态库在静态库前面连接时,必须在命令行最后使用动态连接的命令才能正常连接 ,如: gcc test.cpp -L. -Wl,-Bdynamic -ltestdll -Wl,-Bstatic -ltestlib -Wl,-Bdynamic 最后的-Wl,-Bdynamic表示将缺省库链接模式恢复成动态链接。 其中用到的两个选项:-Wl,-Bstatic和-Wl,-Bdynamic。这两个选项是gcc的特殊选项,它会将选项的参数传递给链接器,作为链接器的选项。比如-Wl,

动态库的加载和执行

冷暖自知 提交于 2019-11-28 16:21:37
void *ldopen(const char* filepath, int flag);打开动态库文件,返回一个指针作为句柄handle,失败返回NULL. flag标志取值RTLD_NOW表示立即加载到内存,RTLD_LAZY表示在使用时加载。 char *lderror(void);取得一个字符串描述动态库出错信息。 void *ldsym(viod *handle, const char *symbol);查找知道的符号在动态库中的地址,失败返回NULL. int ldclose(viod *handle);关闭动态库,从内存卸载. 头文件<dlfcn.h>,这些函数在libdl.so中,在gcc编译时需要 gcc -ldl来链接动态库 ldopen 指定动态库文件没有路径会从LD_LIBRARY_PATHz中查找;带上全路径就会去指定路径查找 来源: https://blog.csdn.net/Dam_Sam/article/details/100086092

linux 给运行程序指定动态库路径

风流意气都作罢 提交于 2019-11-28 15:45:16
1. 连接和运行时库文件搜索路径到设置 库文件在连接(静态库和共享 库)和运行(仅限于使用共享库的程序)时被使用,其搜索路径是在系统中进行设置的。一般 Linux 系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径【deepin可以在里面搜索出qt,因为deepin默认安装了qt程序运行依赖库】,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到 库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用: (1). 在 /etc/ld.so.conf 文件中添加库的搜索路径。(或者在/etc/ld.so.conf.d 下新建一个.conf文件,将搜索路径一行一个加入-junziyang) 将自己可能存放库文件的路径都加入到/etc /ld.so.conf中是明智的选择添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如: /usr/X11R6/lib /usr/local/lib /opt/lib 需要注意的是:这种搜索路径的设置方式对于程序连接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是 因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so

Android:cmake实际指南

三世轮回 提交于 2019-11-28 08:41:06
一、静态库与动态库构建   (.so)共享库,shared object:节省空间,在运行时去连接,如果执行机器上没有这些库文件就不能执行。   (.a)静态库,archive:静态库和程序化为一体,不会分开。   通过 ldd命令可以查看一个可执行程序所依赖的的共享库。   使用环境变量LD_LIBRARY_DIRECTORY可以指定共享库位置  1.编译共享库: ADD_LIBRARY(hello SHARED ${SHARED_LIBRARY})  2.添加静态库 : ADD_LIBRARY(hello STATIC ${STATIC_LIBRARY})   因为默认规则是不能有相同名字的共享库与静态库,所以当生成静态库的时候,共享库会被删除,所以需要通过SET_TARGET_PROPERTIES()来解决这个问题,例子: SET_TARGET_PROPERTIES(hello_static PROPERTIES OUTPUT_NAME "hello")   cmake在构建一个target的时候,会删除之前生成的target,一样是通过设置SET_TARGET_PROPERTIES(hello PROPERTIES CLEAN_DIRECT_OUTPUT 1)来达到目的。  3.动态库的版本号:   同样是通过SET_TARGET_PROPERTIES()来设置 SET

cpp调用c的动态库

落爺英雄遲暮 提交于 2019-11-28 07:59:01
目录 cpp调用c的动态库 title: cpp调用c的动态库 date: 2019/11/22 20:34:29 toc: true --- cpp调用c的动态库 CPP文件里这么引用头文件即可 extern "C" { #include "apue.h" } 来源: https://www.cnblogs.com/zongzi10010/p/11938685.html

Makefile文件基本格式

£可爱£侵袭症+ 提交于 2019-11-28 07:25:44
以下是Makefile的基本模板 #指定编译器 CC = g++ #指定编译参数 CFLAGS = -std=c++11 #指定头文件路径,此处用于指定非标准库的头文件路径 INC = -I./ -I /usr/include #指定要链接的动态库或静态库 -L是指定动态库路径,非标准的动态库需要此参数 LIBS = -lm -ldl -L/mylibs/xxx -lxxx #把上面放一起 CXXFLAGS = ${CFLAGS} ${INC} ${LIBS} #指定生成可执行文件名称 EXEC = a.out #指定由哪些文件来生成可执行文件 OBJS = xxx1.o xxx2.o #make执行动作 ${EXEC} : ${OBJS} ${CC} -o $@ $^ #make clean动作 clean: rm -rf ${OBJS} #中间文件的生成 %.o:%.c $(CC) $(CXXFLAGS) $(INC) -o $@ -c $< 不生成中间.o文件 #指定编译器 CC = g++ #指定编译参数 CFLAGS = -std=c++11 #指定头文件路径,此处用于指定非标准库的头文件路径 INC = -I./ -I /usr/include #指定要链接的动态库或静态库 -L是指定动态库路径,非标准的动态库需要此参数 LIBS = -lm -ldl -L

QT 环境安装和跨平台编译那些事

南楼画角 提交于 2019-11-27 19:48:47
QT源码和SDK下载 http://download.qt.io QT5.13安装 windows下通常使用VS来开发,而linux下则使用OtCreator来开发。 linux,以Ubuntu为例 安装Qt前需要先安装 g++ make sudo apt-get install libgl1-mesa-dev 安装环境准备好后直接安装 ./qt-opensource-linux-x64-5.13.0.run 即可。 注意:一般安装在/usr下,里面很多文件夹,根据文件的类型,分门别类,不是一个软件一个文件夹。以前老版本的Linux习惯放在/usr/local目录下。 部分软件放在/opt下,则是一个软件统一在一个文件夹下。/opt目录专门是用来给第三方软件放置文件的,比如一些压缩包解压的软件都放在这里。 比如“网易云音乐”就安装在/usr/lib/netease-cloud-music 比如Chrome就放在/opt/google/chrome Windows下调试工具的安装设置(使用微软的编译器) 安装完VisualStudio2017后,接着安装win10 SDK,安装完成后,在C:\Program Files (x86)\Windows Kits\10\Debuggers\x64(x86)下有一个cdb.exe用于调试。 Windows下