Linux下C/C++动静态库
定义 myadd.c mysub.c
我们想把此方法提供给别人使用,但我们并不想提供源码。
此时就需要使用库来解决
什么是库?
库就是方法们编译为二进制码后整合在一起。供程序链接。
动态库 libx
定义 myadd.c mysub.c 我们想把此方法提供给别人使用,但我们并不想提供源码。 此时就需要使用库来解决 什么是库? 库就是方法们编译为二进制码后整合在一起。供程序链接。 动态库 libxxx.so 运行时把库代码加载到内存,通过页表映射到虚拟地址空间的共享区,当程序需要方法时,再跳转去执行库中的代码,程序本身没有方法的代码。因此程序运行依赖库文件,无法独立运行 静态库 libxxx.a 编译时把库中代码拷贝链接到程序里,运行时执行自己的代码,可以独立运行,不依赖库文件。 如何生成 静态库 1.将方法编译为.o文件(二进制码) 此时已经可以交给他人使用 但是并不规范 2.利用归档工具ar 整合.o文件为静态库 动态库 1.编译出与位置无关码(编译时添加 -fPIC选项 ) 动态库需要与位置无关码是因为 程序需要在运行时再去找库的代码linux 拖库,库和进程地址空间独立 2.利用gcc/g++ 将.o文件再次编译为动态库 在编译时添加 -shared 选项 表示编译为动态库,需要确保.o文件为 fPIC形式 如何使用 例有如下代码 mytest.c 如何只利用我们上面生成的动静态库让这段代码跑起来呢 静态库 libmymath.a 1.-L 指定库路径 编译器会默认到系统库目录去找 所以需要 -L 指定库路径 或把库拷贝到系统库路径或者建立软硬链接(造成命名污染,不推荐) 2. -l 指定库名 库名需要去掉前缀(lib)和后缀(.a/.so)这一步比较特殊 运行结果无误 动态库 libmymath.so 1.-L 指定库目录 -l 指定库名 此时运行, 可能出错 程序运行时找不到动态库 因为程序一旦编译出来 就与编译器无关了 ,经过了编译操作系统只知道这个进程依赖那些库,程序运行起来后 却可能不知道操作系统不知道去哪里 把库加到内存,因此我们需要执行第二步 2.添加环境变量(推荐) 你也可以直接把库拷贝到系统库路径(或建立软硬链接)或添加配置文件->都可能造成命名污染 (不推荐) 我们env 中有一个环境变量LD_LIBRARY_PATH 来保存默认的库的路径 我们往这个环境变量中添加库所在的路径 ,动态库就能被正确的加载到内存了 此时程序能正确运行 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |