linux下的静态库和动态库以及gcc常见编译选项

AI权益码!Claude Code、Cursor等20+工具免费用! 购周边限时赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

一、linux下的静态库和动态库

linux和windows下都有大量的库,库在本质上就是可执行的二进制代码,可以被操作系统载入内存执行。我们通常将一些通用函数写成函数库,所以库是别人写好的,现有的,成熟的,可以复用的代码,你可以使用但要必须得遵守许可协议。

1.静态库
静态库的文件命名方式是“libxxx.a",库名前加"lib",windows和linux下都是用后缀”.a",“xxx"为静态库名,windows下的静态库名也是“libxxx.a”。
链接时间:静态库的代码是在程序编译过程中载入代码的。
链接方式:静态库的链接方式是将整个函数库的所有数据都整合进目标代码中。静态链接的优点是在编译后的程序不再需要外部函数库的支持。但是,如果静态库发生更新改变,程序必须重新编译。

2.动态库
动态库的文件命名方式和静态库相似是"libxxx.so",库名前加"lib",后缀为”.so"。而windows下动态库命名为"libxxx.dll"。dll即"dynamic link library"。
链接时间:动态库在编译的时候并没有被编译进目标代码,而是当你的程序执行到相关函数时才调用该函数库里的相应函数。这样做缺点是因为函数库并没有整合进程序,所以程序的运行环境必须提供相应的库。优点是动态库的改变并不影响你的程序,所以动态函数库升级比较方便。

当同一个程序分别使用静态库,动态库两种方式生成两个可执行文件时,静态链接所生成的文件所占用的内存要远远大于动态链接所生成的文件。这是因为静态链接是在编译时将所有的函数都编译进了程序,而动态链接是在程序运行时由操作系统帮忙把动态库调入到内存空间中使用。另外如果动态库和静态库同时存在时,链接器优先使用动态库。
在linux下可以通过ar命令来创建一个静态库。
如果希望把源码 file1.c、flle2.c、…fileN.c 做成库文件,则我们可以分别通过下面命令把他们制作成静态库或动态库:
静态库:
gcc -c file1.c
gcc -c file2.c

gcc -c fileN.c
ar -rcs libname.a file1.o file2.o … fileN.o
其中,-r选项即replace,-c即create,-s即static。

动态库:
gcc -shared -fPIC -o libname.so file1.c file2.c … fileN.c

使用静态库或动态库:
gcc main.c -o myapp -L lib_path -lname
其中“-L”选项指定库所在的路径,"-l"(小写L)选项指定库的名字。

二、gcc常见编译选项

选项说明
-E只进行预处理,不编译
-S只编译,不汇编
-c只编译,汇编,不链接
-g编译生成的可执行文件包含gdb调试信息,可被gdb调试
-o指定编译生成的可执行文件名
-I(大写的i)指定include包含的头文件的搜索路径
-L指定动态链接时动态库所在的路径
-l(小写的L)指定动态链接时动态库的名字
-ansiansi标准
-std=99C99标准
-Werror不区分警告和错误,遇到任何警告都停止编译
-Wall开启大部分警告提示
--static静态编译
-static静态链接
-O0关闭所有优化选项
-O1第一级别优化,使用此选项可使可执行文件更小、运行更快,并不会增加太多编译时间,可以简写 为-O
Linux下使用gcc编译C程序的过程及常见选项 Linux下的gccg++简介 gcc 与 g++ 分别是 gnu 的 c &c++ 语言的编译gcc/g++ 在执行编译工作的时候,总共需要4步: 1、预处理,生成 .i 的文件[预处理器cpp] 2、将预处理后的文件转换成汇编语言, 生成文件 .s [编译器egcs] 3、由汇编变为目标代码(机器代码)生成 .o 的文件[汇编器as] 4、连接目标代码, 生成可... 阅读详情

相关推荐

Linux应用(一)——GCC静态库动态库

gcc的使用、静态库的制作与使用、动态库的制作与使用。

m0_56399733的博客 2295

Linux动态库(.so)静态库(.a)编译使用

文章目录前言一、动态库静态库简介二、动态库1.编译动态库2.编译程序三、静态库1、编译生成静态库2、编译程序总结图片资源动态库静态库: 前言 提示:这里可以添本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 一、动态库静态库简介 在Linux下有两种类型的库文件,分别是libxxx.solibxxx.a。 分别称动态库静态库,本文主要讲述如何在Linux编译生成这两种库,以及它们的使用方法,下面

czjunhanf的博客 2271

Linux - 如何使用gcc命令生成静态库动态库

Linux下查看是否有静态库:ar  -tv  test.a   一、库的简述 简单的说,库(Library)是由系统提供的一组具有特定功能的函数的集合,是为提高开发效率运行效率而设计的。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。库分静态库动态库两种。 静态库: 静态是指每个用到该库的应用程序都会将该库拷贝到自己的目标代码中,因此利用静态库生成的文件比较大。这类库

YANG 3978

linux编译生成动态库静态库,以及使用

一、介绍 在实际开发过程中,当代码的文件较多,可以将一部分代码编译动态库或者静态库然后再载到程序中使用 编译过程 1、预编译 2、编译 3、汇编 4、链接 静态库动态库的差异 1、链接静态库简单理解就是复制目标代码嵌入可执行文件中 2、动态库是在程序运行时被链接的,所以磁盘上只须保留一份副本 3、动态库在程序运行时被链接,故程序的运行速度链接静态库的版本相比必然会打折扣 gcc总体选项列表 1) -c :指编译,不链接,生成目标文件“.o”。 2) -S :只编译,不汇编,生成汇编代码“.S”。 3

锅锅的博客 9175

【c语言】gcc编译动态库静态库使用说明

c语言gcc编译动态库静态库使用说明

hutaotaotao的博客 2931

Linux编译选项&静态库动态库

GCC编译编译选项: -c 仅执行预处理、编译汇编,生成可定位目标文件。 -S 仅执行预处理编译,生成汇编文件。 -E 仅执行预处理,预处理结果输出至标准输出。 -ansi 关闭GNU C中ANSI C不兼容的语法特征。 -Dmacro 相当于C语言中的#define macro,常见的是打开调试-DDEBUG打开可重入标志-D_REENTRANT,编译内核模块-DMODULE

FelixGe的专栏 1795

Linux】——动静态库

库文件主要分为动态库静态库Linux中,以.so为后缀的是动态库,以.a为后缀的是静态库。在Window中,以.dll为后缀的是动态库,以.lib为后缀的是静态库。在程序编译时链接到可执行文件中,本质上是将库中的代码数据到可执行文件中,所以静态库代码就成了可执行文件的一部分了。这就意味着多个程序使用同一个静态库时,库代码会被重复复制,从而导致程序体积太大。是在运行时由操作系统载到内存中的库,多个程序可以一个动态库,所以程序体积较小,库更新后,只需要替换动态库文件,不需要重新编译

super_coders的博客 732

深入理解GCC动态库调用:从编译选项到线程库实践

掌握GCC调用动态库的技术是Linux开发的重要技能。理解动态库静态库的区别及适用场景掌握-fPIC-shared-L-l等关键编译选项熟悉动态库的运行时查找机制及环境变量设置能够正确处理多线程等常见库的链接了解动态调试技术通过本文的详细讲解实例演示,即使是Linux新手也应该能够自信地在项目中使用动态库了。记住实践是最好的学习方式,多动手编写测试代码,遇到问题时善用lddnmgdb等工具进行调试分析。

niuTyler的博客 1066

自学Linux 5—Linux 环境下的编译器之 GCC 编译器工具集详细知识点以及静态库动态库的使用

一、Linux 下的 GCC 编译器工具集   在 Linux 环境下的编译器之 Vim 安装与基本操作使用 中介绍了如何使用 Linux 环境下的编译器编写程序,并编写了一个 hello.c 的程序。要使编写的程序能够运行,需要进行程序的编译Linux 环境下采用的编译GCC 来进行对程序的编译。 1. GCC 简介   GCCLinux 下的编译工具集,是 GNU Compile...

Change_Improve的博客 2991

Linux开发工具——gcc/g++

本文介绍了Linux下使用gcc/g++编译运行代码的完整流程。gcc用于C语言,g++兼容C++C语言。编译过程分为预处理(宏替换、去注释)、编译(生成汇编)、汇编(生成机器码)链接(生成可执行文件)四个步骤,可通过-E、-S、-c选项分步执行。文章还对比了静态库(.a)动态库(.so)的特点:静态库独立但体积大,动态库共享但依赖性强。最后提供了常用gcc选项说明,包括优化级别、调试信息生成等实用编译参数。

lrhhappy的博客 1053

Linux平台下GCC/G++编译与链接静态库动态库详解

本文详细讲解了Linux平台下使用GCC/G++编译链接静态库(.a)与动态库(.so)的方法。主要内容包括:库的基本概念原理对比;静态库的生成步骤、链接方式及命名规范;动态库的创建过程、位置无关代码编译运行时载机制;关键编译选项详解;完整的库创建到程序运行的示例;动静态库的优缺点比较;以及常见问题的解决方案。文章通过实例代码命令演示,帮助开发者掌握模块化编程的核心技术,实现代码的高效复用管理。最后指出在实际项目中应根据需求合理选择库类型,并建议使用Makefile实现构建自动化。

songmake1987的博客 1067

Linux 静态库动态库

静态动态库把源代码转换成机器读懂的二进制。

2401_89133765的博客 157

Linux下C程序动态库.so静态库.a的生成使用

这个错误是在动态库执行的时候经常会遇到,说找不到这个.so文件,如果放在/lib或者/usr/lib下,那么默认就能找到。比如程序的源文件为:main.c【我创建的目录是/root/host/my_program/asoc/my_program】比如程序的源文件为:test.c【我创建的目录是/root/host/my_program/asoc/my_program】我在路径/root/host/my_program/asoc/include下创建下面的文件。下面通过一个小栗子介绍如何生成一个动态库

u011563926的专栏 664

Linuxgcc编译静态库动态库的制作

Linuxgcc编译静态库动态库文章目录:1 gcc编译过程1.1 gcc编译过程1.2 gcc的常用参数2 gcc 静态库的制作2.1 静态库的制作流程2.2 静态库的优缺点3 gcc 动态库 / 共享库 的制作3.1 动态库 / 共享库的制作流程3.2 动态库查找不到解决方法3.3 动态库的优缺点 gcc是文本编译器,就是编译代码的工具,下面介绍gcc编译C语言(.c文件)的流程...

求真、务实 6753

Linux操作系统】GCC编译静态库动态库制作详解

本文详细介绍了GCC编译过程以及如何制作静态库动态库。通过预处理、编译、汇编链接四个阶段,我们可以将源代码转换成可执行文件或者库文件。静态库将多个目标文件打包成一个文件,程序在编译时会将静态库的代码复制到可执行文件中;而动态库是在程序运行时被载的库文件,它可以被多个程序共享使用,减少了内存的占用。

Goforyouqp的博客 1万+

Linux动态库静态库——动态库静态库的打包使用、gcc编译、拷贝到系统默认的路径、建立软连接

Linux动态库静态库静态库动态库的介绍、静态库的打包使用、生成静态库、使用静态库的三种方式、gcc编译、拷贝到系统默认的路径、建立软连接、动态库的打包使用、生成动态库、使用动态库、解决载不到动态库的方法

Crocodile1006的博客 2719

GCC生成静态库动态库实例以及GCC编译工具集中各软件的用途

掌握GCC工具集ELF格式能够深入理解程序从源码到执行的完整过程,有效解决编译链接中的各种问题以及进行程序性能分析优化掌握Linux系统下的二进制文件分析,为后续学习操作系统、编译原理打下基础,这套知识体系是Linux C/C++开发工程师的核心技能,对于理解系统底层工作原理进行高效程序开发具有重要意义。类型:ET_EXEC4)共享目标文件 (.so)动态链接库文件类型:ET_DYN5)核心转储文件 (core)程序崩溃时的内存转储文件类型:ET_CORE。

2502_92895989的博客 1972

Linuxgcc动态库静态库,程序是如何链接的

Linux环境下,除了学好编辑器 vim 的使用,还需要学会C语言的编译gcc 的功能,否则代码无法翻译成可执行程序。本文将介绍 gcc 的常规使用方法,以及一个C语言程序,在链接的时候发生了什么。

m0_65679465的博客 3123
上一篇: 嵌入式linux安装dropbear
下一篇: FL2440开发板第一次烧录以及启动过程简要分析
心.跳
博客等级 码龄8年 27粉丝 30原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值