Linux基础——gcc编译、静态库与动态库(共享库)

Linux基础——gcc编译、静态库与动态库(共享库)gcc编译器1、gcc工作流程2、gcc常用参数参数用途-v查看版本-o产生目标文件-I+目录指定头文件目录-D编译时定义宏-00/-01/-03没有优化/缺省值/优化级别最高-Wall提示更多警告信息-c只编译子程序-E生成预处理文件…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

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 更新
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/188809.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 请写出用Graphics2D类的新方法画一个图形的步骤(表格如何画斜线)

    在机器人需要发表格图片需求,我搜索了一些第三方包,最终使用了java内置的Graphics2D来画表格生成jpg图片,再通过cq语句发送。表格图片,需要有标题,表格头,表格内容,将表格头和表格前三名设置背景色。使用Graphics2D画图,需要画横线,竖线,还有字体,其中选择位置进行渲染比较繁琐。所以我将画表格分为几部分来画1、先定图片大小图片的高…

  • 有效避免JS全局变量污染

    有效避免JS全局变量污染1、使用名称空间varA={};//必须定义为对象A.person={name:"zhangsan",age:18,body:{height:"180cm",weight:"70kg"}};//var定义的全局不能被删除//deleteA;//隐式全局变量被删除//deleteA.p…

  • Python创建微信机器人「建议收藏」

    Python创建微信机器人「建议收藏」微信,一个日活10亿的超级app,不仅在国内社交独领风骚,在国外社交也同样占有一席之地,今天我们要将便是如何用Python来生成一个微信机器人,突然想起鲁迅先生曾经说过的一句话:因为是微信机器人系列的第一篇文章,所以猪哥会特别详细的讲解每一地方,尽量使每一位想学习的同学都能顺顺利利的开始,下面就让我们一起来做些有趣的事吧!一、项目介绍1.微信库选择python关于开发微信的库主要有it…

  • 出版了两本实体书,写了9本开源电子书,还上了百度百科,冰河这是要起飞了吗?(建议收藏)

    出版了两本实体书,写了9本开源电子书,还上了百度百科,冰河这是要起飞了吗?(建议收藏)我在CSDN的这两年:出版了两本实体书,各自加印1万册,写了9本开源电子书,还上了百度百科!!

  • 让人“眼前一亮、不明觉厉”的互联网技术PPT「建议收藏」

    让人“眼前一亮、不明觉厉”的互联网技术PPT「建议收藏」为什么选择分享一起如此“鸡肋”的博文呢?我一直有个习惯:理论和实践,两手抓两手也要硬,最近一直搞技术,手里很多的新技术资料还未来得及消化,遂学习总结,加以分享。在做互联网产品功能介绍、互联网产品技术路线、技术人年度总结、互联网教育培训、互联网技术宣讲、技术人毕业答辩等场合时,可以参照以下PPT,让你思如泉涌,格调升级,瞬间征服观众~

  • Hostapd Android[通俗易懂]

    Hostapd Android[通俗易懂]HostapdAndroidhttps://github.com/lnmcc/hostapd-android http://www.omitol.com/archives/109.html http://forum.xda-developers.com/showthread.php?t=1988735 http://droidmodderx.com/galaxyn…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号