Linux 编译生成静态库以及动态库全流程

news/2024/7/8 2:36:03 标签: linux, 运维, 服务器, c语言

在Linux系统中,通常不直接使用.lib作为库文件的扩展名,因为.lib是Windows平台下常用的静态库文件扩展名。然而,Linux下对应的静态库文件扩展名是.a(archive),而动态库文件扩展名是.so(shared object)。

以下是在Linux下编译生成静态库(.a文件)和动态库(.so文件)的全流程,并给出示例代码。

静态库(.a文件)

示例代码

假设我们有两个源文件libfoo.clibbar.c,它们将组成静态库。

libfoo.c

#include "libfoo.h" 


int foo() { 
return 42; 
}

libfoo.h

#ifndef LIBFOO_H 
#define LIBFOO_H 


int foo(); 


#endif // LIBFOO_H

libbar.c(类似地,有一个对应的头文件)

编译流程
  1. 编译源文件为对象文件

    gcc -c libfoo.c -o libfoo.o 
    gcc -c libbar.c -o libbar.o

  2. 创建静态库
    使用ar命令将对象文件打包为静态库。

    ar rcs libmylib.a libfoo.o libbar.o

    这里,r表示替换现有的目标文件,c表示创建一个库,s表示创建目标文件索引。

动态库(.so文件)

编译流程
  1. 编译源文件为PIC(Position Independent Code)对象文件
    使用-fPIC(Position Independent Code)选项来编译源文件,因为动态库需要位置无关的代码。

    gcc -fPIC -c libfoo.c -o libfoo_pic.o 
    gcc -fPIC -c libbar.c -o libbar_pic.o

  2. 创建动态库
    使用gcc-shared选项来创建动态库。

    gcc -shared -o libmylib.so libfoo_pic.o libbar_pic.o

使用库

使用静态库

在编译程序时,使用-L选项指定库文件所在的目录,并使用-l选项指定库名(不需要前缀lib和后缀.a)。

gcc -o myprogram myprogram.c -L. -lmylib

注意:. 表示当前目录。

使用动态库

与静态库类似,但在运行时,还需要确保动态库文件在系统的库路径中,或者通过LD_LIBRARY_PATH环境变量指定其位置。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:. 
./myprogram

或者,你可以将动态库安装到标准库路径下,如/usr/local/lib,并使用ldconfig来更新动态链接器的缓存。

注意事项

  • 在生产环境中,库文件通常安装在标准路径下,如/usr/lib/usr/local/lib
  • 动态库文件还需要相应的头文件以便其他程序能够正确地包含和使用库中的函数和变量。这些头文件通常与库文件一起安装。
  • 在使用动态库时,务必注意版本兼容性和依赖关系。

http://www.niftyadmin.cn/n/5536187.html

相关文章

哈喽GPT-4o,对GPT-4o 论文速写的思考与探索

作为一款强大的语言模型,ChatGPT 在论文写作上具备显著优势。它能够辅助学者或研究人员自动创建论文框架、摘要、文献综述及论文段落(如引言、方法、结果、结论等)。此外,ChatGPT 还能优化论文结构、润色、降低内容重复率&#xf…

【redis】jedis概述_简单使用(Java中使用redis)

1、定义与背景 Jedis是Redis官方推崇的Java客户端实现之一,允许Java程序通过其提供的Java API与Redis服务器进行交互。Redis是一款高性能的NOSQL系列的非关系型数据库,使用C语言开发,支持多种键值数据类型,包括字符串、哈希、列表…

如何使用 3D 建模库在 C# 中将 3DS 转换为 USDZ?

USDZ/USD是一种 3D 文件格式,被广泛用于跨平台共享 3D 资产。另一方面,3DS是另一种以块形式存储数据的 3D 文件格式。在某些情况下,您需要将3DS 文件转换为 USDZ/USD文件格式。因此,本篇博文介绍了一个功能丰富的3D 建模库&#x…

什么是独立服务器?

独立服务器是指一个单独的物理服务器,整体的硬件设施都是独立存在的,有着强大的性能,只需要运行用户个人的数据信息,并且可以享受到独立服务器的硬件与软件,当网站有着大量的用户进行访问或者是需要运行大型的软件时&a…

Apache Hadoop完全分布式集群搭建指南

Hadoop发行版本较多,Cloudera版本(Cloudera’s Distribution Including Apache Hadoop,简称CDH)收费版本通常用于生产环境,这里用开源免费的Apache Hadoop原始版本。 下载:Apache Hadoop 版本下载:Index of /hadoop/common Hadoop基础知识可查看本专栏其它篇章:Apac…

速盾:ddos高防ip是什么?

DDoS攻击是一种通过向目标网络发送大量的无效请求,以致其无法正常运作的攻击方式。这种攻击方式广泛应用于各种网络服务,如网站、服务器、游戏等。由于DDoS攻击可以导致被攻击的网络瘫痪,因此许多组织和个人都开始关注网络安全,并…

科技赋能智慧应急:“数字孪生+无人机”在防汛救灾中的应用

近期,全国多地暴雨持续,“麻辣王子工厂停工”“水上派出所成水上的派出所了”等相关词条冲上热搜,让人们看到了全国各地城市内涝、洪涝带来的严重灾情。暴雨带来的影响可见一斑,潜在的洪水、泥石流、山体滑坡等地质灾害更应提高警…

大数据面试题之数据库(2)

数据库中存储引擎MvlSAM与InnoDB的区别 Mylsam适用于什么场景? InnoDB和Mvlsam针对读写场景? MySQL Innodb实现了哪个隔离级别? InnoDB数据引擎的特点 InnoDB用什么索引 Hash索引缺点 数据库索引的类型,各有什么优缺点? MySQL的索引有哪些?索引…