从零开始学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.hqwc.cn/news/447952.html

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

相关文章

双非本科准备秋招(14.1)—— 力扣刷题

今天做两个有点难度的题。 1、295. 数据流的中位数 手写堆实现: 加入元素: 如何维护一个中位数?我们考虑一下堆的特点,大顶堆堆顶是一个最大值,小顶堆堆顶是一个最小值,那么,如果我们可以把数…

路由重定向和别名

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 路由重定向实例场景:路由重定向的应用场景: 2. 路由别名实例场景:路由别名的应用场景: ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&…

【INTEL(ALTERA)】为什么 F-tile Serial Lite IV FPGA IP 设计示例会失败

说明 由于Intel Agilex 7 FPGA I 系列收发器-SoC 开发套件的时钟控制器 GUI 存在问题,当您需要配置芯片 Si5332 的 OUT1 时钟频率时,您可能会发现 F-tile Serial Lite IV 英特尔 FPGA IP设计示例失败。这是因为此 Si5332 GUI 存在问题;无法准确配置 OUT…

Python使用fastAPI实现一个流式传输接口

1. 使用fastapi实现流式传输 1.1 服务端 fastapi_server.py 编写服务端代码fastapi_server.py。服务端代码主要使用了fastapi和uvicorn两个库。 #!/usr/bin/env python # codingutf-8 # Time : 2024/1/31 19:13 # Software: PyCharm from fastapi import FastAPI from fa…

【JavaScript】var,let 和 const 的区别

先看一些前置知识: 此时输出 undefined。 全局作用域:全局都可以访问。函数作用域:只有函数内部可以访问。块级作用域:let 和 const 只能在块级作用域(一对大括号包裹的代码片段)中访问。let 和 const 在变…

怎么把图片的二维码提取出来?免费在线二维码转换成链接的方法

在部分情况下无法直接使用二维码展示内容,那么可以将二维码分解成链接后来使用,点击链接就可以跳转二维码的页面内容,这种方式可以在电脑或者手机上预览二维码内容。怎么提取二维码链接呢?下面小编来教大家二维码解码器的使用方法…

单机搭建hadoop环境(包括hdfs、yarn、hive)

单机可以搭建伪分布式hadoop环境,用来测试和开发使用,hadoop包括: hdfs服务器 yarn服务器,yarn的前提是hdfs服务器, 在前面两个的基础上,课可以搭建hive服务器,不过hive不属于hadoop的必须部…

Linux自动创建本地yum源与清华大学源仓库

Linux自动创建本地yum源与清华大学源仓库 系统环境: Server1:172.20.26.167—CentOS7.6 在172.20.26.167服务器上 yum install yum-utils -y 输入yum按两下tab键,可以看到 yum-config-manager 工具,使用该工具可以自动配置仓…

【正点原子STM32连载】第四十六章 SD卡实验 摘自【正点原子】APM32E103最小系统板使用指南

1)实验平台:正点原子APM32E103最小系统板 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban 第四…

异步编程,到底有什么用?

关键词:高性能、架构设计、异步思想、场景落地 文章导读 场景切入 先来看一个日常生活快递寄件场景,从寄件人(寄件)到收件人(收件),全流程如下 当你准备寄送一个包裹时,通常你可以…

Qt|制作简单的不规则窗体

通常我们用到的对话框基本上都是规则的,在有些特殊情况下,也会使用到不规则窗口,那么该如何实现不规则窗体呢? 在MFC框架下很难实现,应该说是难的都想放弃,但是,Qt框架下提供了一个叫做setMask…

Python+PyQt5+C Hw信息检测

UI主界面: C源代码: /* I/O port access* Copyright (C) 2009 Red Hat Inc.** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Fo…