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

linux 下编译生成静态库和动态库 我们此处为了说明静态库和动态库的编译,会使用示例代码。创建  test.h, hello.cpp 和 world.cpp, 在两个源文件中分别实现两个函数( 此处都是示例代码,文件命名不规范,理解意思即可 )。test.h (静态库头文件)#ifndef _TEST_ #define _TEST_ void hello(); void world(); #endifhello.cpp:#inclu... 阅读详情

GCC编译器编译选项:

-c 仅执行预处理、编译和汇编,生成可定位目标文件。

-S 仅执行预处理和编译,生成汇编文件。

-E 仅执行预处理,预处理结果输出至标准输出。

-ansi 关闭GNU C中和ANSI C不兼容的语法特征。

-Dmacro 相当于C语言中的#define macro,常见的是打开调试-DDEBUG和打开可重入标志-D_REENTRANT,编译内核模块-DMODULE,-D__KERNEL__,-DLINUX。

-Dmacro=var 相当于C语言中的#define macro var

-nostdinc 告诉编译器不在系统默认的头文件目录中查找头文件,一般和-I联合使用来明确指定头文件的位置。

-Wa, option 将此选项传递给汇编器as。

-Wl, option 将此选项传递给链接器ld。

-O[0-3] 编译器优化的4个级别,-O0没有优化,-O1为默认,-O3级别最高。

-static 禁止动态链接。

-shared 编译生成动态库。

-g 使程序能被gdb调试。当系统允许生成coredump文件时(默认coredump文件大小为0,即不产生coredump文件,可通过ulimit查看),可通过如下命令查看是哪个程序产生该coredump文件:

file coredump

gdb –c coredump

-fPIC 通常用在编译动态库时生成位置无关的代码(PIC,position-independent code)。用readelf查看一个可执行ELF文件时,可以看到它有一个固定的加载地址(虚拟地址)。而动态库则没有固定加载地址,因为对于系统上众多的动态库,编译时无法确定哪个库应该放在内存的哪个位置。

- Wall 打开所有警告信息。

 

 

 

1.       Linux静态库和动态库的命名规则:

静态函数库:静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中。

a)       优点:编译后,可执行文件不需要外部支持;

b)       缺点:生成的可执行程序大;静态库改变了,就需要重新编译可执行程序。

 

动态函数库:动态库的名字一般是libxxx.so,相对于静态库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里面相应的函数,因此使用动态函数库生成的可执行文件比较小。由于函数库没有编译进可执行程序,而是程序运行时动态的申请调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变也不会影响可执行程序,针对可执行程序的动态函数库升级也比较容易。

a)       优点:实现进程的资源共享,当程序在运行的时候需要调用某个动态链接库函数时候,OS会先查看所有正在运行的程序,看内存里面是否已经有此函数的拷贝了,有责共享那个拷贝,没有才会链接载入,这样会大大节省OS的内存资源;

b)       优点:升级容易,升级动态链接库即可,不需要重新编译可执行程序;

 

2.       Gcc/g++的编译链接:

通常,对函数的链接是在编译期的时候完成的,所有相关的对象文件与相关联的library被链接成一个可执行文件,这就是使用静态库的编译过程,

而动态库技术:对一些库函数的链接载入推迟到程序运行的时候。

但是,不管是使用静态库还是使用动态库,这些库文件都是由*.o文件生成的,在给编译器gcc传不同的参数,就会生成相应的静态库或者是动态库了。

 

3.       静态库和动态库的创建过程:

a)       创建静态库:

在linux环境下,创建静态库是使用ar命令,具体的选项可以man查看下,例子:

ar  -rt libtest.a   error.o  show.o  test.o

这样就创建了libtest.a静态库文件。

 

b)       创建动态库:

使用gcc编译.c文件的使用,使用-fPIC标签,然后在使用*.o文件生成动态库文件的时候,传递-shared标签给gcc,例子:

Gcc  –fPIC  –c  file1.c

Gcc  -fPIC  -c  file2.c

Gcc  –shared  libtest.so  file1.o  file2.o

这样就创建了libtest.so动态库文件。

 

4.       使用静态库和动态库的方法:

动态库文件和静态库文件的使用方法基本上差不多,在gcc的command里面使用-Lpath和-lxxx标签:

Gcc file1.o file2.o –Lpath –lxxx –o yourprogrammer

编译器会先到path下面寻找libxxx.so文件,如果没有找到,继续寻找libxxx.a文件。

那么动态库函数文件,是在程序运行的过程中决定是否载入的,那么我们需要告诉编译器,去哪里能找到动态库函数文件,在linux或者类unix操作系统里面是使用LD_LIBRARY_PATH环境变量来实现的。

Linux动态库与静态库 基于著名书籍和自我学习得出的Linux动态库与静态库精华知识 阅读详情

相关推荐

篮球比赛24秒计时器改造指南:用Multisim实现可调式倒计时系统

本文详细介绍了如何使用Multisim软件改造篮球比赛24秒计时器,实现可调式倒计时系统。从脉冲信号发生器到声光报警模块,提供了完整的电路设计方案和调试技巧,帮助开发者快速掌握数字电路设计的核心原理,提升体育电子设备开发效率。

wood5的博客 211

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

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

hutaotaotao的博客 2940

RabbitMq安装

本文详细介绍了在CentOS7系统上离线部署RabbitMQ4.3.2的完整流程。主要内容包括:1)准备RabbitMQ安装包、Erlang依赖和socat网络工具;2)安装系统编译依赖并编译安装Erlang;3)部署RabbitMQ服务,配置环境变量和socat依赖;4)启用Web管理插件并创建管理员账号;5)配置防火墙放行端口;6)设置Systemd开机自启服务;7)提供常用运维命令。文档特别强调离线部署注意事项,包括socat依赖、版本兼容性、账号安全及主机名配置等问题,为生产环境部署提供完整解决方案

sinat_25821779的博客 323

GCC编译步骤、动态库和静态库的创建和使用、ELF库简介及查看方法

通过上面的操作,发现一个高级语言程序,通过预处理、编译、汇编之后生成了main.o目标文件的ELF格式文件,这到底是一种怎样的文件格式呢?ELF是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件的文件格式。一个ELF文件一般由四个部分组成:ELF header里面存放着很多整体分布的信息,如文件类型、版本信息等;描述的是一个段在文件中的位置、大小以及它被放进 内存后所在的位置和大小;Section将文件分成一个个节区,每个节区都有其对应的功能,如.text 用于存放机器码;

sjsnsnsnsi的博客 5661

USB摄像头开发实战:从参数配置到图像采集的完整流程(Python+OpenCV)

本文详细介绍了USB摄像头开发的完整流程,从参数配置到图像采集,使用Python和OpenCV实现。内容涵盖硬件原理、环境配置、参数调优及高级优化技巧,帮助开发者解决常见问题如分辨率设置、帧率控制和灯光频闪等,提升开发效率。

star的博客 235

LS-DYNA超高速碰撞仿真入门:从SPH算法配置到铝靶板穿孔分析(附K文件模板)

本文详细介绍了使用LS-DYNA中的SPH(光滑粒子流体动力学)算法进行超高速碰撞仿真的完整流程。以铝弹丸撞击铝靶板为例,从SPH算法原理、LS-PrePost前处理、材料模型与状态方程设置,到接触定义、边界条件及K文件生成,提供了系统的入门指导和关键参数调试经验,帮助工程师高效模拟材料破碎、穿孔等极端变形问题。

h0i1j2k3l的博客 726

【Linux】——动静态库

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

super_coders的博客 738

博途PLC模糊PID控制(量化因子和比例因子)

参数"量化因子和比例因子",都是为了对清晰值进行比例变换而设置的,其作用是使变量按一定比例进行放大或缩小,以便和我们的模糊论域相匹配完成一一映射。这种变换对整个系统的工作性能也是有影响的。(其实相当于额外引入了比例作用,所以说模糊PID的调节是个系统工程)。限于本人能力,文中难免出现错误和不足,欢迎大家批评和指正。博途PLC的模糊PID控制完整算法可以参看下面这篇文章博途PLC模糊PID控制详解(SCL完整源代码+参数)_RXXW_Dor的博客-优快云博客。......

RXXW_Dor的博客 5269

静态库和动态库的编译和使用

我们把公用函数制作成函数库,供其它程序使用。函数库分为静态库和动态库两种。静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才和可执行程序一起被载入内存,因此在可执行程序运行时还需要动态库同时存在。 本文主要通过举例来说明在Linux中如何创建静态库和动态库,以及使用它们。 简单实例,两个模块:add和sub。 ...

ingy 1904

GEE:随机森林分类教程(样本制作、特征添加、训练、精度、参数优化、贡献度、统计面积)

本文将介绍在Google Earth Engine (GEE)平台上进行随机森林分类的方法和代码,其中包括制作样本点教程(本地、在线和本地在线混合制作样本点,合并样本点等),加入特征变量,运行随机森林分类器教程,计算随机森林分类结果的精度,优化随机森林分类算法的参数,打印各个变量特征的贡献度等步骤的方法和代码。本教程可以应用于多种分类场景,包括土地利用分类、种植区提取(大蒜、小麦、玉米等)、局部气候区分类、植被分类等多种场景。

养乐多的博客 1万+

超临界二氧化碳发电技术深度解析

超临界二氧化碳发电技术正在突破传统热电转换的物理边界。作为新一代发

硬核科技 602

gcc编译选项及动/静态库

1. 编译过程 预处理 (加 -E 选项生成 .i 文件) -E 选项指示编译器仅对输入文件进行预处理,预处理文件的拓展名是 .i 。 g++ -E test.cpp -o test.i 编译 (加 -S 选项生成 .s文件) -S 选项告诉编译器在为 C++ 代码产生了汇编语言文件后停止编译,g++ 产生的汇编语言文件的缺省扩展名是 .s 。 g++ -S test.i -o test.s 汇编 (加 -c 选项生成 .o 文件) -c 选项告诉编译器仅把源代码编译为机器语言的目标代码,缺

code_peak 2083

微信群“智”变:扣子机器人无缝接入实战

本文介绍了如何将扣子(Coze)机器人接入微信群实现智能化管理。文章首先阐述了扣子机器人的自然语言处理、自动分类和多模态交互等功能特点,以及其深度学习模型和持续学习能力的技术优势。随后详细讲解了接入步骤:从微信公众号配置、扣子平台机器人创建,到使用Flask框架实现消息转发功能的关键代码。通过电商客服和技术社群两个实际案例,展示了扣子机器人在提升响应效率、优化社群运营方面的显著效果。最后展望了未来在智能推荐、多模态交互等领域的发展潜力,为微信群智能化管理提供了实用解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 831

Linux动态库和静态库

文章目录动静态库的基本原理认识动静态库动静态库各自的特征静态库的打包与使用打包使用动态库的打包与使用打包使用 动静态库的基本原理 动静态库的本质是可执行程序的“半成品”。 我们都知道,一堆源文件和头文件最终变成一个可执行程序需要经历以下四个步骤: 预处理: 完成头文件展开、去注释、宏替换、条件编译等,最终形成xxx.i文件。 编译: 完成词法分析、语法分析、语义分析、符号汇总等,检查无误后将代码翻译成汇编指令,最终形成xxx.s文件。 汇编: 将汇编指令转换成二进制指令,最终形成xxx.o文件。 链接

2021dragon的博客 1万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

【Linux】静态库和动态库

介绍动静态库、制作动静态库以及使用动静态库,基于地址空间理解动态库加载和程序运行的过程!

YoungMLet的博客 4091

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

详解Linux下静态库/动态库的生成和使用(含代码示例和操作流程)&&动态库和静态库的区别

文章目录一、库的概念Windows的库Linux的库二、动态库和静态库的区别1. 载入顺序不同2. 大小与共享的差异3. 库函数调用的差异三、静态库的创建和使用1. 创建静态库的步骤:(一)、ar命令的使用方法(二)、生成静态库的实例2. 调用静态库的测试程序(一)调用静态库的测试程序:test.c(二)编译使用了库函数的程序四、动态库的创建和使用1. 动态库的创建2. 动态库的使用3. 通过调用系统函数来使用动态链接库的实例 关于gcc的使用方法可以参考下方链接博客: Linux下详解gcc编译过程(

weixin_47826078的博客 1万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Linux之静态库和动态库

静态库和动态库下面我们将从工程师的角度,去了解静态库和动态库的形成过程,以及实现它们的制作。并且了解如何将自己的库交给别人,让别人也可以使用。

zdlynj的博客 3821

Linux之动态库和静态库

本文介绍了如何自定义动态库、静态库以及如何使用自定义的动态库和静态库。

一只小卷毛的博客 2933

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

一、linux下的静态库和动态库 linux和windows下都有大量的库,库在本质上就是可执行的二进制代码,可以被操作系统载入内存执行。我们通常将一些通用函数写成函数库,所以库是别人写好的,现有的,成熟的,可以复用的代码,你可以使用但要必须得遵守许可协议。 1.静态库 静态库的文件命名方式是“libxxx.a",库名前加"lib",windows和linux下都是用后缀”.a",“xxx"为静态...

心.跳的博客 1479

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

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

锅锅的博客 9190

【Linux】动态库、静态库

动态库与静态库相关内容

weixin_69380220的博客 1666

Linux——动态库和静态库

与静态库不同,动态库的代码不会被复制到每个程序中,而是在程序运行时从库文件中加载。这意味着当你链接一个静态库到你的程序时,库中的代码会被复制到最终的二进制文件里。在Linux中,链接过程分为两个阶段:编译(Compilation)和链接(Linking)。在实际开发中,开发者可能会根据项目的特点和部署环境来决定使用哪种类型的库。静态库和动态库各有优缺点,选择使用哪一种通常取决于具体的应用场景和需求。对于静态库,链接发生在编译阶段,而动态库的链接则发生在程序运行时。(动态链接器)能够找到并加载正确的库文件。

weixin_55582891的博客 1510

Linux 静态库和动态库

在实际开发中,我们把通用的函数和类分文件编写,称之为库。在其它的程序中,可以使用库中的函数和类。一般来说,通用的函数和类不提供源代码文件(安全性、商业机密),而是编译成二进制文件。库的二进制文件有两种:静态库和动态库。

qq_41885018的博客 1438

Linux系统中的静态库和动态库

Linux系统中的静态库和动态库

2403_82436914的博客 1040
上一篇: extern linux用法详解
FelixGe
博客等级 码龄19年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值