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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • uva-10194-排序

    uva-10194-排序

    2022年3月5日
    49
  • java中jbpm工作流_activiti工作流教程

    java中jbpm工作流_activiti工作流教程JBOSSjBPM 工作流管理系统简介jBPM,全称是JavaBusinessProcessManagement,是一种基于J2EE的轻量级工作流管理系统。jBPM是公开源代码项目,它使用要遵循 ApacheLicense。jBPM在2004年10月18日,发布了2.0版本,并在同一天加入了JBoss,成为了JBoss企业中间件平台的一个组成部分,它的名称也改成JBossj

    2025年10月16日
    3
  • hibernate的几种主键

    hibernate的几种主键

    2021年9月6日
    43
  • python3基础:操作xml

    python3基础:操作xmlXML指的是可扩展标记语言(eXtensibleMarkupLanguage),和json类似也是用于存储和传输数据,还可以用作配置文件。类似于HTML超文本标记语言,但是HTML所有的标签都是预定义的,而xml的标签可以随便定义。XML元素指从开始标签到结束标签的部分(均包括开始和结束)一个元素可以包括:其它元素<aa> <bb></bb&gt…

    2022年7月12日
    19
  • 用C语言进行Windows编程入门

    用C语言进行Windows编程入门用C语言进行Windows编程入门本文对一般教程或网上有的(如C语言语法等基础)不深入介绍,对初学者易造成疑惑误解或难以找到的内容进行较详尽的介绍。学习C语言很久了,一直面对控制台应用程序(Win32ConsoleApplication),没有漂亮的界面,是不是不爽呀。用C开发图形界面程序,有多种技术方案,本文希望用简单的例子,深入浅出的介绍一种方案——用C和SDK进行图形界面编程。…

    2022年6月18日
    23
  • Virtualbox下使用virt-p2v

    Virtualbox下使用virt-p2v1虚拟机迁移参考:http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm1/index.html2物理机到虚拟机的迁移virt-p2vredhat官方文档:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/V2V_Guide/cha

    2022年7月26日
    12

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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