从零开始学Linux之gcc链接

目录

创建静态库并使用

创建动态库(共享库)并使用


链接:将.o目标文件链接起来生成一个可执行程序文件,可分为静态链接和动态链接

静态链接:链接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,一旦链接成功就可独立运行,生成的可执行文件不再需要任何静态库文件的支持就可以独立运行。缺点是如果所使用的静态库发生更新改变,就需要必须重新编译。

动态链接:不会直接将该函数的代码拷贝到文件中,而是将函数的位置信息记录到文件中,然后生成可执行文件。这样生成的可执行文件是无法独立运行的,但是可执行文件中记录了所需功能函数的位置信息,所以也可以成功运行。如果该动态链接库不存在了该可执行文件就无法运行。动态库的代码只有程序执行的时候才会加入到可执行文件,优点就是用户更新了动态库不需要重新编译,缺点是可移植性差,无法独立运行,必须借助相应的库文件。

gcc的其他具体过程可以看我上次发的博客

https://blog.csdn.net/m0_62574258/article/details/135956002?spm=1001.2014.3001.5501

创建静态库并使用

静态库文件是一组相关的目标文件的集合,以及用于链接这些目标文件的元数据。ar命令可以将目标文件打包成一个静态库文件,也可以从静态库文件中提取目标文件。

先将test.c源文件转换成test.o目标文件

gcc -c test.c

新建打包文件libtest.a(静态库),然后将test.o目标文件添加到该包文件

ar -rcsv libtest.a test.o

-r      添加文件到打包文件中

-c     新建打包文件

-s     生成打包文件的符号表

-v     显示运行的完整信息

-d     删除打包文件中的文件

在程序中链接静态库,使用-static选项

gcc test.c -static -o hello.static -L. -lhello

直接编译main.c发现缺少hello函数,hello函数定义在hello.c文件中

把hello.c编译成hello.o目标文件

将hello.o目标文件打包进静态函数libhello.a

将main.c与静态函数libhello.a链接生成静态可执行文件main.static

gcc -static -o hello.static -L. -lhello

加上选项-static,使用-L指定函数库路径,这里-L.表示函数在当前目录,-l指定函数,需要把前面的lib去掉,如库函数叫libhello.a。只需要-lhello

运行该可执行文件

查看main.static的文件类型,是statically linked,即静态链接可执行文件

创建动态库(共享库)并使用

gcc -c -fPIC hello.c

使用-fPIC选项编译的.o文件会生成位置无关的代码

gcc -shared hello.o -o libhello.so

使用-shared选项把目标文件变成动态文件库

在程序中链接动态库

gcc main.c -L. -lhello -o main

使用-fPIC选项编译.o文件

gcc -c -fPIC hello.c

使用-shared选项把目标文件变成动态文件库

gcc -share hello.o libhello.so

将main.c与动态函数libhello.so链接生成动态可执行文件main,不指定static默认为动态链接

gcc main.c -L. -lhello -o main

查看main的文件类型,是executabledynamically linked,即动态链接可执行文件

运行程序发现无法运行,无法打开共享文件,因为程序在运行时,会在/usr/lib找需要的动态库文件,若找到则载入动态库,否则将提示类似上述错误而终止程序运行,有三种解决方法

方法1:libhello.so文件复制到/usr/lib目录下

成功运行,如果把/usr/lib目录下的libhello.so文件删掉该程序就不能运行

方法2:配置环境变量LD_LIBRARY_PATH

将动态库的路径添加到环境变量LD_LIBRARY_PATH

方法3: 修改/etc/ld.so.conf配置文件

libhello.so文件的目录添加到该文件

使用ldconfig命令使配置生效,然后就能成功运行可执行文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662623.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue3前端开发,element-plus前端框架探秘:scope对象

vue3前端开发,element-plus前端框架探秘:scope对象!我们经常需要对当前行的数据进行操作,比如增加,删除,编辑等,为此我们需要传递当前行所对应的唯一主键,通常情况下,当前行对应的业务主键是id属…

麒麟系统—— openKylin 安装 Maven

麒麟系统—— openKylin 安装 Maven 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。2. 确保 java 已经安装完毕 二、下载Maven三、解压 Maven 与环境配置解压配置环境变量验证 最终:介绍配置的其他参数使用 本文将分享如何在麒麟操作系统 openKylin 上安装…

一些大语言模型(LLM)相关的开源项目

一些大语言模型(LLM)相关的开源项目 更多文章访问: https://www.cyisme.top 因为站内限制问题,有些图片无法显示,导致阅读体验较差,可以访问原文:《一些大语言模型(LLM)相关的开源项…

Json序列化和反序列化 笔记

跟着施磊老师学C 下载&#xff1a;GitHub - nlohmann/json: JSON for Modern C 在single_include/nlohmann里头有一个json.hpp&#xff0c;把它放到我们的项目中就可以了 #include "json.hpp" using json nlohmann::json;#include <iostream> #include <…

Unity_使用Shader实现玻璃和镜面效果

效果图如下&#xff1a; 玻璃效果图 镜面效果图 Step1 搭建场景→镜子使用Quad代替&#xff0c;放置在需要反射的墙面→创建新的材质和Shader Step2 墙壁外创建Camera&#xff0c;用来渲染物体后方的视图→创建RenderTexture&#xff0c;赋于该相机 Step3 Shader的编写如下…

PyTorch][chapter 13[李宏毅深度学习][Semi-supervised Linear Methods-2]

前言&#xff1a; 接上篇CSDN 这里面重点讲下面4个方面 目录&#xff1a; PCA-Another Point of view&#xff08;SVD&#xff09; PCA 和 AutoEncoder 的关系 PCA 的缺点 PCA Python 例子 一 PCA-Another Point of view 以手写数字7的图像为例&#xff0c;它由不…

RabbitMQ控制台的基本使用

启动RabbitMQ后&#xff0c;浏览器 http://localhost:15672 打开RabbitMQ的控制台页面后&#xff0c;登录默认账户guest。 一. 添加队列 控制台选择队列&#xff0c;然后选择添加队列&#xff0c;队列类型默认经典类型&#xff0c;然后输入队列名称&#xff0c;最后添加队列。…

百度输入法往选字框里强塞广告

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 国内几乎100%的输入法都有广告&#xff0c;只是你们没发现而已&#xff01;&#xff01;&#xff01; 百度输入法居然在输入法键盘上推送广告&#xff0c;近日&#xff0c;博主阑夕 表示&#xff0c;V2EX论坛上有…

2024年美国大学生数学建模竞赛F题思路分析与数据

题目 非法野生动物贸易对环境造成了负面影响&#xff0c;并威胁全球生物多样性。据估计&#xff0c;其涉及高达265亿美元的年交易额&#xff0c;被认为是全球所有非法交易中的第四大。[1] 你需要开发一个基于数据驱动的5年项目&#xff0c;旨在显著减少非法野生动物贸易。你的…

PFA氟气吸收装装置耐强酸PFA气体洗涤装置本底纯净

PFA氢气吸收装置在PFA尾气处理中扮演着重要的角色。PFA&#xff08;可溶性聚四氟乙烯&#xff09;是一种聚合物材料&#xff0c;具有良好的化学惰性和耐腐蚀性。在半导体工业过程中&#xff0c;PFA尾气中可能含有氢气等有害气体&#xff0c;需要进行处理以确保环境安全和合规性…

深度解析ScheduledThreadPoolExecutor源码之DelayedWorkQueue

文章目录 引言一、什么是二叉堆&#xff1f;1.1什么是最大堆、最小堆&#xff1f;1.2堆的基本操作1.2.1插入节点元素1.2.2删除节点元素1.2.3构建二叉堆 1.3堆特性总结 二、DelayedWorkQueue源码解析2.1 DelayedWorkQueue参数解析2.2 DelayedWorkQueue方法解析 总结 引言 该系列…

力扣之2648.生成 斐波那契数列(yield)

/*** return {Generator<number>}*/ var fibGenerator function*() {let a 0,b 1;yield 0; // 返回 0&#xff0c;并暂停执行yield 1; // 返回 1&#xff0c;并暂停执行while(true) {yield a b; // 返回 a b&#xff0c;并暂停执行[a, b] [b, a b]; // 更新 a 和 …

开发微信小程序--适配 iPhone X 总结

一、展示效果 这是正常的样式效果&#xff1a; 这是不正常的效果&#xff1a; 二、原因分析&#xff1a; 在iPhone 6/7/8型号下是正常的&#xff0c;但在iPhone X等下是不正常的。 由于在 iPhone X 屏幕顶部状态栏区域有“齐刘海”&#xff0c;以及在屏幕底部增加了“操作…

Maven dependency中的scope

Maven的一个哲学是惯例优于配置(Convention Over Configuration), Maven默认的依赖配置项中&#xff0c;scope的默认值是compile。 scope的分类 compile&#xff08;默认&#xff09; 含义&#xff1a; compile 是默认值&#xff0c;如果没有指定 scope 值&#xff0c;该元素…

Microsoft Edge 浏览器报错 提示不安全

网站提示不安全 是因为 Microsoft Edge 开了安全过滤 我们需要把这个关掉 打开浏览器的设置&#xff0c;然后 找到隐私选项 找到下边的Microsoft Defender Smartscreen 关掉 Microsoft Edge 支持 Microsoft Defender SmartScreen | Microsoft Learn win10系统下打开网页提示…

谈谈BlueFS

目录 前言数据结构标识一个文件文件系统的全局记录事务记录超级块 启动流程磁盘管理读写流程创建文件流程为文件写数据把数据下刷到磁盘读流程 参考资料 前言 BlueFS具体是个什么东西呢&#xff1f; 如上图&#xff0c;在Ceph里&#xff0c;使用BlueStore作为默认的存储引擎。…

Day06-Linux下目录命令讲解及重要文件讲解

Day06-Linux下目录命令讲解及重要文件讲解 1. Linux目录文件1.1 Linux系统目录结构介绍1.1.1 Linux与Windows目录结构对比 1.2 重要的Linux配置文件介绍1.2.1 /etc系统初始化及设置相关重要文件1.2.2 /usr目录的重要知识介绍------应用程序目录1.2.3 /var目录下的路径知识-----…

Shell中正则表达式与sed编辑器

目录 一、正则表达式 1.1.正则表达式介绍 1.2.正则表达式分类 1.3.元字符 1.4.扩展正则表达式元字符 二、sed编辑器 2.1.sed编辑器是什么 2.2.sed编辑器的工作流程 2.3.sed命令格式 一、正则表达式 1.1.正则表达式介绍 1、正则表达式---通常用于判断语句中&#xff0…

Redis单机-主从集群-哨兵集群-分片集群 搭建教程

Redis集群 本章是基于CentOS7下的Redis集群教程&#xff0c;包括&#xff1a; 单机安装RedisRedis主从Redis分片集群 1.单机安装Redis 首先需要安装Redis所需要的依赖&#xff1a; yum install -y gcc tclredis-6.2.4.tar.gz 然后将Redis安装包上传到虚拟机的任意目录&am…

Vue3 vant4 解决引入的Toast和dialog样式丢失的bug

情景再现&#xff1a; 正确做法&#xff1a; 在main.ts中单独引入 import vant/es/toast/style import vant/es/dialog/style import { Toast, Dialog } from vantapp.use(Toast) app.use(Dialog)效果如下 轻松拿下。