Linux下动态库和静态库编译实践

news/2024/2/23 14:29:33/文章来源:https://blog.csdn.net/legendaryhaha/article/details/135578060

Linux下动态库和静态库编译实践

  • 背景
  • 动态库(.so文件)
  • 静态库(.a文件)
  • 关于GLIBC

背景

之前写过JNI的文章,在JNI实践过程中,也涉及到对动态库/静态库的一些编译实践,这里统一记录一下。

动态库(.so文件)

  • 注意:-fPIC编译选项可使GCC生成位置无关代码,简单来说生成的代码中的函数与全局变量均为相对地址,通过GOT (Global offset table)来确定其位置,这种方式引入了一层额外的间接性,会有一定的性能损失。
gcc -c -W -Wall -Werror -fpic foo.c
gcc -shared -o libfoo.so foo.o
gcc -L/home/username/foo -W -Wall -o test main.c -lfoo
  • 在linux配置动态库使用位置,有如下两种方式:
    1. 使用环境变量来可配置的使用动态库
export LD_LIBRARY_PATH=/home/username/foo:$LD_LIBRARY_PATH
#只有导出这个环境变量才能被子进程继承
./test
  1. 使用rpath指定动态库的绝对路径
unset LD_LIBRARY_PATH
gcc -L/home/username/foo -Wl,-rpath=/home/username/foo -Wall -o test main.c -lfoo
./test
  • 将动态库就安装到系统中,这样编译时就可以不加-L
cp /home/username/foo/libfoo.so /usr/lib
#/usr/lib是32位 /usr/lib64是64位
chmod 0755 /usr/lib/libfoo.so
ldconfig
  • 查看动态库
nm -D libmyfunc.so

静态库(.a文件)

  • 静态库实际上是一组目标文件(object files)的打包,可以通过工具(例如ar)将它们组合成一个归档文件(archive file)。
gcc -c myfunc.c -o myfunc.o
ar rcs libmyfunc.a myfunc.o
#查看这个静态库里面都打包了什么obj文件
ar tf myfunc.a
#查看静态库中都有哪些符号
nm myfunc.a

关于GLIBC

我们知道Linux Kernel是使用GNC C编译器编译的,那么GLIBC是我们肯定要用到的库,Kernel和GLIBC两者的版本关系在link时确定,所以我们要保证不要自行升级GLIBC,否则会导致kernel无法启动。

  • 查看动态库关联的GLIBC版本:
ldd -v myexample.so
  • 查看动态库中的所有符号
nm -D myexample.so

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

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

相关文章

Pandas.DataFrame.groupby() 数据分组(数据透视、分类汇总) 详解 含代码 含测试数据集 随Pandas版本持续更新

关于Pandas版本: 本文基于 pandas2.1.2 编写。 关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。 Pandas稳定版更新及变动内容整合专题: Pandas稳定版更新及变动迭持续更新。 Pandas API参…

弟12章 网络编程

文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165TCP服务器端代码的编写 p166TCP服务器端流程 TCP客户端代码的编写 p167TCP客户端流程主机和客户端的通信流程 tcp多次通信服务器端代码 p168TCP多次通信客户端代码 p169UDP的一次双向通信 p170udp通信模型udp接收方代码u…

生活的再思考,写在开篇

近几年的就业行情很特别,特别是对中年人,早先网络上主流的声音是动不动总包百万,手握几个 Offer ,纠结应该去哪里。现在的主流声音变成了,被毕业优化掉后几个月都没找到合适的工作,焦虑迷茫无所适从&#x…

第5章案例课:部署Tomcat及其负载均衡

这个实验需要3台虚拟机 192.168.9.40 9.31 9.32 去FTP 下载软件包 192.168.9.40 和 192.168.9.31 都要这里面的配置[rootnode1 ~]# mount /dev/cdrom /mnt/ //挂载[rootnode1 ~]# rpm -ivh /mnt/Packages/ftp-0.17-67.el7.x86_64.rpm //下载 FTP 软件包[roo…

发送HTTP POST请求并处理响应

发送HTTP POST请求并处理响应是Web开发中的常见任务。在Go语言中,可以使用net/http包来发送HTTP POST请求并处理响应。 以下是一个示例代码,演示了如何发送HTTP POST请求并处理响应: go复制代码 package main import ( "b…

模拟开关灯

1.  实验任务 如图所示,监视开关K1(接在P3.0端口上),用发光二极管L1(接在单片机P1.0端口上)显示开关状态,如果开关合上,L1亮,开关打开,L1熄灭。…

51单片机_电子时钟电子万年历电子闹钟

实物演示效果: https://www.bilibili.com/video/BV1RN4y1Q7dK/?vd_source6ff7cd03af95cd504b60511ef9373a1d 二、液晶对比度的调节 液晶的内容要清晰显示,就要调节电位器来调节液晶的对比度,这个电位器位于液 晶的下面,可以用…

网络服务之DHCP

目录 一、DHCP是什么? 1、DHCP就是动态主机配置协议 2、DHCP的作用: 3、DHCP是应用层协议 二、DHCP的优点 三、DHCP的分配过程 1、自动分配:分配到一个ip地址后永久使用 2、手动配置:由DHCP服务器管理员专门指定ip地址&am…

NFS(Network File System 网络文件服务)

一,nfs 简介 1,nfs 性质 NFS(Network File System 网络文件服务) 文件系统(软件)文件的权限 NFS 是一种基于 TCP/IP 传输的网络文件系统协议 通过使用 NFS 协议,客户机可以像访问本地目录一样…

.Net 8.0 Web API Controllers 添加到 windows 服务

示例源码下载:https://download.csdn.net/download/hefeng_aspnet/88747022 创建 Windows 服务的方法之一是从工作线程服务模板开始。 但是,如果您希望能够让它托管 API 控制器(也许是为了查看它正在运行的进程的状态)&#xff0…

微软推出付费版Copilot

关注卢松松,会经常给你分享一些我的经验和观点。 微软已经超越苹果,成了全球市值最高的公司,其他公司都因为AI大裁员,而微软正好相反,当然这个原因很简单:就是微软强制把AI全面接入到系统里来了。而Copilot…

在线的货币兑换平台源码下载

在线的货币兑换平台,可帮助全球各地的个人和企业将货币从一种货币兑换为另一种货币。该货币兑换平台是 Codecanyon 中最先进的脚本。 源码下载:https://download.csdn.net/download/m0_66047725/88728084

Android签名打包报错:Lint found fatal errors while assembling a release target.

1. Android签名打包报错:Lint found fatal errors while assembling a release target. 1.1. 问题 Android项目打debug 包的时候没问题,但是在打release迭代测试版本时候无法打包。Lint found fatal errors while assembling a release target. 1.2. …

【centos7系统】Redis-6.2.2版本集群搭建

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 前redis最新版本已经是6.2.4,在集群搭建上和redis3.x、redis4.x区别很大。redis5以后,就不需要安装ruby了…

软件测试|pycharm关联GitHub的详细步骤

简介 GitHub 是全球最大的开源代码托管平台之一,而 PyCharm 是一款强大的 Python 集成开发环境。将两者结合使用,可以提高团队协作和代码管理的效率。本文将详细介绍如何在 PyCharm 中管理 GitHub 账号,包括如何设置 GitHub 账号、创建新仓库…

Python基础知识:整理15 列表的sort方法

1 sorted() 方法 之前我们学习过 sorted() 方法,可以对列表、元组、集合及字典进行排序 # 1.列表 ls [1, 10, 8, 4, 5] ls_new sorted(ls, reverseTrue) print(ls_new) …

JVM:双亲委派机制类加载器

JVM:双亲委派机制 1. 例子2. 类加载器总结3. 类加载过程4. 双亲委派模型的执行流程:5. 双亲委派模型的好处 1. 例子 Java运行时环境有一个java.lang包,里面有一个ClassLoader类 我们自定义一个String类在java.lang包下,下面的…

如何安装“MySQL在虚拟机ubuntu”win10系统?

1、 更新列表 sudo apt-get update 2、 安装MySQL服务器 sudo apt-get install mysql-server 3、 安装MySQL客户端 sudo apt-get install mysql-client 4、 配置MySQL sudo mysql_secure_installation 5、 测试MySQL systemctl status mysql.service MySQL数据库基本…

QT 绘图与重绘事件

代码实现仪表盘 .cpp #include "widget.h" #include "ui_widget.h"#include <QPainter> #include <QPen> #include <QBrush>#include <QDebug> Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->…

ROS第 2 课 ROS 系统安装和环境搭建

文章目录 方法一&#xff1a;一键安装&#xff08;推荐&#xff09;方法二&#xff1a;逐步安装&#xff08;常规安装方式&#xff09;1.版本选择2.检查 Ubuntu 的软件和更新源3.设置 ROS 的下载源3.1 设置国内下载源3.2 设置公匙3.3 更新软件包 4. 安装 ROS5. 设置环境变量6. …