gcc生成静态库与动态库(附带使用方法) |
您所在的位置:网站首页 › c语言什么文件可以直接封装进动态库 › gcc生成静态库与动态库(附带使用方法) |
目录 前言: 1.gcc生成静态库. 从使用者的角度出发,如何使用别人的静态库? 方法1: 方法2:直接使用静态库 2.gcc生成动态库 动态库的使用: 第二种方法:(与使用静态库的方法一样) 解决方案: 方法3: ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新 关于动态库与静态库的补充: 前言:对于动静态库,在以后的工作中一定会使用到,因此了解如何打包和使用是十分必要的事,不妨花几分钟来看看! 1.gcc生成静态库.首先,从发布静态库的角度出发,我们需要打包哪些文件? 1. .o文件 2. .h文件 实例: 首先创建.c和.h文件。 再通过指令 gcc -c myadd.c(文件名) -o myadd.o(文件名) 得到.o文件。 再将.o文件打包成静态库.a 指令: ar -rc libmyadd.a(以lib开头的静态库名) myadd.o(需要打包的.o文件) 最后一步: 从发布者的角度出发,我们需要将 静态库.a 和头文件.h进行打包,这样别人才能正常使用。 有一个myadd(可以理解为是静态库的名),在myadd的目录下,包括include文件夹和lib文件夹。 include文件夹中存放.h文件。 lib文件夹中存放.a文件。 完成以后就大功告成了! 从使用者的角度出发,如何使用别人的静态库? 方法1:将这个库直接拷贝到系统路径下(如果是自己写的库,不建议这样做) 其中头文件gcc的默认搜索路径在 /usr/include 其中库文件的默认搜索路径在 /usr/lib64 or /lib64 拷贝以后,就可以直接编译我们所写的.c文件了吗? 当然不可以! 由于我们所写的库是第三方库,在编译的时候,还需要一步操作。 gcc mytest.c -lmyadd(去掉lib和.a的库名) 方法2:直接使用静态库通过指令 gcc xxx.c -I(大写i) +头文件目录 -L +库文件目录(.a文件) -l(小写L)库文件名 就可以直接使用了。 实例: gcc mytest.c -I ./myadd/include -L ./myadd/lib -lmyadd 即可 2.gcc生成动态库与静态库相似,需要将库文件和头文件进行打包,不过动态库的后缀名是.so 首先生成.o文件 gcc -c -fPIC xxx.c -o xxx.o 形成.o文件 再形成库文件: gcc -shared xxx.o -o lib库名.so 再将头文件和库文件进行打包,分别放入include文件夹,和lib文件夹。 动态库的使用:与静态库的使用方法类似。 第二种方法:(与使用静态库的方法一样)动态库编译以后的可执行程序,并不能直接运行 会弹出无法加载动态库。 这是为什么呢?不是已经告诉了动态库的位置了吗?为什么还是没办法加载呢? 原因在于,我们只是在gcc的时候,告诉了gcc,动态库的位置,但是并没有告诉系统动态库的位置。 解决方案:更改 LD_LIBRARY_PATH,将动态库的位置添加到这个路径下。 方法3: ldconfig 配置/etc/ld.so.conf.d/,ldconfig更新 关于动态库与静态库的补充:1.如果对于同一个lib文件夹中,同时存在同名的静态库和动态库,在编译时,会优先选择动态库! 2.如果执意选择静态库,则需要在编译的时候添加 -static选项! 3.如果10个进程都有同一个静态库,那么运行的时候,会有9份重复的代码,而动态库则不会出现这样的情况。
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |