博客
关于我
Linux基础——gcc编译、静态库与动态库(共享库)
阅读量:794 次
发布时间:2023-02-03

本文共 1901 字,大约阅读时间需要 6 分钟。

gcc 编译器

1、gcc工作流程

这里写图片描述

 2、gcc常用参数

参数 用途
-v 查看版本
-o 产生目标文件
-I+目录 指定头文件目录
-D 编译时定义宏
-00/-01/-03 没有优化/缺省值/优化级别最高
-Wall 提示更多警告信息
-c 只编译子程序
-E 生成预处理文件
-g 包含调试信息

静态库

1、静态库的命名格式

lib + 库的名字 + .a
例:libMyTest.a (MyTest为静态库的名字)

2、静态库作用分析

在项目开发过程中,经常出现优秀代码重用现象,又或者提供给第三方功能模块却又不想让其看到源代码,这些时候,通常的做法是将代码封装成库或者框架,生成的静态库要和头文件同时发布。

优点:

寻址方便,速度快

库在链接时被打包到可执行文件中,直接发布可执行程序即可以使用
缺点:

静态库的代码被加载到可执行程序中,因此体积过大

如果静态库的函数发生改变,必须重新编译可执行程序
3、静态库的制作与使用

这里写图片描述

测试代码的目录结构如上图所示,include中存放的是头文件,lib中存放的是静态(动态)库,src中存放的是源代码,main.c是发布代码。

 第一步:得到*.o文件

gcc *.c -c -I../include

这里写图片描述

第二步:创建静态库

ar rcs libMyTest.a *.o        将所有.o文件打包为静态库,r将文件插入静态库中,c创建静态库,不管库是否存在,s写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。mv libMyTest.a ../lib         将静态库文件放置lib文件夹下nm libMyTest.a                查看库中包含的函数等信息

这里写图片描述

第三步:使用静态库

第一种方法:gcc + 源文件 + -L 静态库路径 + -l静态库名 + -I头文件目录 + -o 可执行文件名gcc main.c -L lib -l MyTest -I include -o app./app第二种方法:gcc + 源文件 + -I头文件 + libxxx.a + -o 可执行文件名gcc main.c -I include lib/libMyTest.a -o app

动态库(共享库)

1、动态库的命名格式

lib + 库的名字 + .so

例:libMyTest.so (MyTest为动态库的名字)

2、动态库作用分析

共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。

优点:

节省内存

易于更新,不用重新编译可执行程序,运行时自动加载
缺点:

延时绑定,速度略慢

3、动态库的制作与使用

测试代码的目录结构与静态库相同。

第一步:生成与位置无关的.o文件

 

gcc -fPIC *.c -I ../include -c   参数-fPIC表示生成与位置无关代码

 这里写图片描述

 第二步:创建动态库

gcc -shared -o libMyTest.so *.o        参数:-shared 制作动态库 -o:重命名生成的新文件mv libMyTest.so ../lib

这里写图片描述

 第三步:使用动态库

第一种方法:gcc + 源文件 + -L 动态库路径 + -l动态库名 + -I头文件目录 + -o 可执行文件名gcc main.c -L lib -l MyTest -I include -o app./app(执行失败,找不到链接库,没有给动态链接器(ld-linux.so.2)指定好动态库 libmytest.so 的路径)第二种方法:gcc + 源文件 + -I头文件 + libxxx.so + -o 可执行文件名gcc main.c -I include lib/libMyTest.so -o app(执行成功,已经指明了动态库的路径)

如何解决第一种方法中找不到链接库的问题:

使用命令ldd app可以查看当前的链接库情况第一种方法:export LD_LIBRARY_PATH=自定义动态库的路径(只能起到临时作用,关闭终端后失效)LD_LIBRARY_PATH : 指定查找共享库(动态链接库)时除了默认路径之外的其他路径,该路径在默认路径之前查找第二种方法:将上述命令写入home目录下的.bashrc文件中,保存后重启终端生效(永久)第三种方法:直接将动态库拷贝到user/lib的系统目录下(强烈不推荐!!)第四种方法:将libmytest.so所在绝对路径追加入到/etc/ld.so.conf文件,使用sudo ldconfig -v 更新

转载地址:http://kmzfk.baihongyu.com/

你可能感兴趣的文章
Linux多线程工作笔记0005---Linux多线程基础_创建线程pthread_create_线程等待_线程终止
查看>>
Linux大文件拆分、合并、校验
查看>>
Linux大页内存管理等---菜鸟初学
查看>>
linux如何使用docker建立gitlab-runner
查看>>
Linux如何创建一个新进程
查看>>
Linux如何在一个 Crontab 中安排多个 Cron 作业?
查看>>
linux如何提取文件名称,Linux系统中获取路径的文件名的方法
查看>>
linux如何查看安装了哪些软件
查看>>
Linux学习 - 文件系统常用命令
查看>>
Linux学习--第一天--Unix 、 Linux 发展史,Linux应用领域
查看>>
Linux学习--第七天--用户和用户组
查看>>
Linux学习--第三天--linux文件目录、ls、mkdir、mv、rm、touch、cat、tac、more、less、head、tail、ln、chmod、chown、chgrp、umask
查看>>
Linux学习--第九天--du、df、fsck、dumpe2fs、mount、NTFS-3G、fdisk、partprobe、/etc/fstab、free、mkswap、swapon
查看>>
Linux学习--第二天--分区、格式化、系统安装、vmware、远程管理工具
查看>>
Linux学习--第五天--vim使用、rpm命令
查看>>
Linux学习--第八天--acl、SetUID、SetGID、chattr、lsattr、sudo
查看>>
Linux学习--第六天--软件包
查看>>
Linux学习--第十一天--source、环境变量目录、欢迎信息、正则、cut、awk、sed、sort、判断表达式、if、for、case、一些脚本
查看>>
Linux学习--第十三天--日志、系统运行级别、grub加密
查看>>
Linux学习--第十天--bash脚本、用户自定义变量、环境变量、位置参数变量、预定义变量、标准输入输出、wc、history、dd、PS1
查看>>