Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux基础——gcc编译、静态库与动态库(共享库)

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

作者头像
全栈程序员站长
发布于 2022-11-10 07:48:40
发布于 2022-11-10 07:48:40
9K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

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文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc *.c -c -I../include

第二步:创建静态库

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

第三步:使用静态库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
第一种方法:
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文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -fPIC *.c -I ../include -c   参数-fPIC表示生成与位置无关代码

第二步:创建动态库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
gcc -shared -o libMyTest.so *.o        参数:-shared 制作动态库 -o:重命名生成的新文件
mv libMyTest.so ../lib

第三步:使用动态库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
第一种方法:
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
(执行成功,已经指明了动态库的路径)

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
使用命令ldd app可以查看当前的链接库情况

第一种方法:
export LD_LIBRARY_PATH=自定义动态库的路径
(只能起到临时作用,关闭终端后失效)
LD_LIBRARY_PATH : 指定查找共享库(动态链接库)时除了默认路径之外的其他路径,该路径在默认路径之前查找

第二种方法:
将上述命令写入home目录下的.bashrc文件中,保存后重启终端生效(永久)

第三种方法:
直接将动态库拷贝到user/lib的系统目录下(强烈不推荐!!)

第四种方法:
将libmytest.so所在绝对路径追加入到/etc/ld.so.conf文件,使用sudo ldconfig -v 更新

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月27日 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
随着时间的积累,日志数据会越来越多,当你需要查看并分析庞杂的日志数据时,可通过 Filebeat+Kafka+Logstash+Elasticsearch 采集日志数据到Elasticsearch(简称ES)中,并通过 Kibana 进行可视化展示与分析。
高楼Zee
2021/09/23
2.1K0
Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
容器部署日志分析平台ELK7.10.1(Elasisearch+Filebeat+Redis+Logstash+Kibana)
  ELK日志分析系统是Logstash、Elastcsearch、Kibana开源软件的集合,对外是作为一个日志管理系统的开源方案,它可以从任何来源、任何格式进行日志搜索、分析与可视化展示。
非著名运维
2022/06/22
1.3K0
容器部署日志分析平台ELK7.10.1(Elasisearch+Filebeat+Redis+Logstash+Kibana)
Docker 入门到实战教程(十二)ELK+Filebeat搭建日志分析系统
一般我们需要进行日志分析场景:直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。
小东啊
2020/07/23
4.8K1
Docker 入门到实战教程(十二)ELK+Filebeat搭建日志分析系统
ELK入门
ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写,Elasticsearch,Logstash 和 Kibana。这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,故被简称为 ELK 协议栈.
测试加
2022/03/24
5610
ELK入门
Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现
当我们在开源日志分析系统的领域,谈及 ELK 架构可谓是家喻户晓。然而,这个生态系统并非 Elastic 有意为之,毕竟 Elasticsearch 的初衷是作为一个分布式搜索引擎。其广泛应用于日志系统,实则是一种意料之外,这是社区用户的推动所致。如今,众多云服务厂商在推广自己的日志服务时,往往以 ELK 作为参照标准,由此可见,ELK 的影响力之深远。
栗筝i
2023/10/23
1.7K0
Elasticsearch实践:ELK+Kafka+Beats对日志收集平台的实现
日志分析平台ELK 7.0时代来了
集群架构图 1. Elasticsearch集群部署 1.1 初始化java组件 # 安装jdk root@es-logs-20-114:/usr/local# ls -l | grep jdk lrwxrwxrwx 1 root root 22 Apr 1 2017 jdk -> /usr/local/jdk1.8.0_65 drwxr-xr-x 8 root root 4096 Nov 25 2015 jdk1.8.0_65 # 配置java环境变量 export JAVA_HOME
公众号: 云原生生态圈
2021/11/15
3560
日志分析平台ELK 7.0时代来了
kubernetes Filebeat+ELK日志收集监控方案
接收来自filebeat的数据,根据其中的tags进行分类,再添加index进行分类,例如nginx-access-%{+YYYY.MM.dd},在kibana中会根据这个index获取日志。
kubernetes中文社区
2019/06/24
3.2K0
kubernetes  Filebeat+ELK日志收集监控方案
docker安装elasticsearch(最详细版)[通俗易懂]
https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.7.0/elasticsearch-analysis-ik-7.7.0.zip 将IK分词器上传到/tmp目录中(xftp)
全栈程序员站长
2022/06/30
1.8K0
docker安装elasticsearch(最详细版)[通俗易懂]
利用docker搭建ELK.md
本打算只有elastisearch、kibanan、logstash搭建下ELK,奈何logstash是运行太占内存,于是打算用filebeat(占用资源少)来在各服务器来收集日志,然后统一交给logstash来处理过滤。
晓果冻
2022/06/17
2870
利用docker搭建ELK.md
ELK+filebeat采集java日志
此文章是我在生产环境下搭建ELK日志系统的记录,该日志系统主要是采集Java日志,开发人员能通过kibanaWeb页面查找相关主机的指定日志;对于Java日志,filebeat已做多行合并、过滤行处理,更精准的获取需要的日志信息,关于ELK系统的介绍,这里不再赘述。
肓己
2021/08/12
1.8K0
springboot第63集:Netty,docker,elasticsearch,kibana一文让你走出微服务迷雾架构周刊...
找到你的 Elasticsearch 配置文件(通常位于 /etc/elasticsearch/elasticsearch.yml),然后确保以下配置被正确设置:
达达前端
2024/03/07
1840
springboot第63集:Netty,docker,elasticsearch,kibana一文让你走出微服务迷雾架构周刊...
手把手教你在CentOS上安装ELK,对服务器日志进行收集
ELK 不是一款软件,而是 Elasticsearch、Logstash 和 Kibana 三种软件产品的首字母缩写。这三者都是开源软件,通常配合使用,而且又先后归于 Elastic.co 公司名下,所以被简称为 ELK Stack。根据 Google Trend 的信息显示,ELK Stack 已经成为目前最流行的集中式日志解决方案。
Java极客技术
2022/12/02
4.4K0
手把手教你在CentOS上安装ELK,对服务器日志进行收集
docker安装Kibana和Fscrawler
我们在上一节安装了ElasticSearch:1.17.7版本,查看官方版本兼容适配:
yuanshuai
2023/11/17
5780
7000 字 | 20 图 | 一文带你搭建一套 ELK Stack 日志平台
最近在折腾 ELK 日志平台,它是 Elastic 公司推出的一整套日志收集、分析和展示的解决方案。
悟空聊架构
2022/05/13
9070
7000 字 | 20 图 | 一文带你搭建一套 ELK Stack 日志平台
使用 Docker Compose V2 快速搭建日志分析平台 ELK (Elasticsearch、Logstash 和 Kibana)
ELK的架构有多种,本篇分享使用的架构如图所示: Beats(Filebeat) -> -> Elasticsearch -> Kibana,目前生产环境一天几千万的日志,内存占用大概 10G 左右
易墨
2024/01/21
3.9K1
使用 Docker Compose V2 快速搭建日志分析平台 ELK (Elasticsearch、Logstash 和 Kibana)
【docker】使用docker安装部署elasticsearch+Kibana
Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。
宝耶需努力
2022/12/13
4K0
【docker】使用docker安装部署elasticsearch+Kibana
Elasticsearch Logstash Kibana Filebeat 搭建
ELK+Filebeat的流程应该是这样的:Filebeat->Logstash->(Elasticsearch<->Kibana)由我们自己的程序产生出日志,由Filebeat进行处理,将日志数据输出到Logstash中,Logstash再将数据输出到Elasticsearch中,Elasticsearch再与Kibana相结合展示给用户。
BUG弄潮儿
2020/06/15
1.7K0
Elasticsearch Logstash Kibana Filebeat 搭建
【ES三周年】 docker搭建elk初体验
这篇文章将着重于我对ELK的搭建初体验,基于部署和安装的方便,也为了巩固Docker相关的知识点的学习和熟练运行,尝试在使用Docker来搭建整个ELK系统。
猫老师的叶同学
2023/02/23
4810
Filebeat入门
Beats 可以将数据直接传输到 Elasticsearch 或传输到 Logstash 。
py3study
2020/02/20
2.4K0
实战篇-Docker 安装ELK(单节点)
@派大星
2024/04/02
5240
实战篇-Docker 安装ELK(单节点)
推荐阅读
相关推荐
Filebeat+Kafka+Logstash+Elasticsearch+Kibana 构建日志分析系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验