用gcc编译生成静态链接库*.a文件的方法

Linux编译环境配置基础笔记   动态库命名方式libc.so  --lib是前缀,. so是后缀 静态库命名方式libc.a   --lib是前缀,.a是后缀 gcc默认的库连接方式是动态库链接 gdb 的指令: run 运行程序 Start 开始逐步调试 n 下一步 s 下一步 b file:line 向指定文件借定行添加断点 i b 查看断点信息 d num 删除序号num 的断点 d 删除... 阅读详情
1、用gcc的-c选项生成.o文件,如
gcc -c test1.c test2.c test3.c
编译后会生成test1.o test2.o test3.o三个目标文件。
2、然后用ar命令生成.a文件,如

ar crv test.a test1.o test2.o test3.o


我们知道静态库也称档案库,在此档案文件中实际上是收集了一系列的目标文件。这    
  些目标文件就是由cc(gcc)函数的源代码编译生成的。因此,静态库的生成方法实际上    
  可以分成两步:    
  1.将各函数代码所在的源文件编译成目录文件。例如,对于myfunc.c,可以用如下命令    
  将其编译成目标文件:    
                  gcc   -c   myfunc.c    
  当然在有多个源文件时,只需在gcc   命令行中将其分别列上就可以了。    
  经此一步我休养将能够得到各源文件的目标文件。对上例,将得到myfunc.o    
  2.将各目标文件收集起来放到一个静态库文件中。这主要借助于ar命令完成,如:    
                  ar   r  /usr/local/lib/libtest.a   myfunc.o    
   
  建立动态链接库、并不需要用到其他的工具,借助于gcc命令即可完成。此时需在命令    
  行中加上-K   PIC和-G这两个选项,如下我们可以建立libtest的动态版本:                  
                  gcc   -K   PIC   -G   -o   $HOME/lib/libtest.so   myfunc.c
     
    
  发信人:   hellguard   (小四),   信区:   Unix                  
  标     题:   顺便贴个生成linux动态库的    
  发信站:   BBS   水木清华站   (Fri   Nov   12   10:49:03   1999)    
   
  本来格式很好看的,但因为要贴到这里所以    
  扭曲了不少,见谅见谅。这里给的是linux下的例子,    
  但是solaris下的也差不多,如果你发现不同,就给    
  个详细说明出来,好不好。    
   
  ldd   filename就可以看到程序用到哪些库。    
   
  ld   -o   OUTPUT   /lib/crt0.o   hello.o   -lc    
  ld将输出最终结果文件   OUTPUT   ,    
  用到/lib/crt0.o   hello.o以及libc.a    
  libc.a来自标准库搜索路径,请参看-l选项的讨论    
   
  ld的选项顺序任意,可以重复,后面的将覆盖前面的。    
   
  gcc   -c   -fPIC   linuxlib.c   -O3   -o   linuxlib.o    
  gcc   -shared   -Wl,-soname,liblinuxlib.so.1   \    
          -O3   -o   liblinuxlib.so.1.0   linuxlib.o    
  (    
  ld   -m   elf_i386   -shared   -o   liblinuxlib.so.1.0   \    
          -soname   liblinuxlib.so.1   linuxlib.o    
  这个语句产生的文件更小,不知道二者有何区别    
  -o   liblinuxlib.so.1.0   这个文件名任意,关键是后面    
  两个符号连接要正确    
  当然推荐使用有意义的带版本信息的名字,包括      
  -soname   liblinuxlib.so.1    
  )    
  ln   -sf   liblinuxlib.so.1.0   liblinuxlib.so.1    
  (      
          运行时,dynamic   linker根据   -soname   \    
          liblinuxlib.so.1   去寻找liblinuxlib.so.1    
  )    
  ln   -sf   liblinuxlib.so.1   liblinuxlib.so    
  (      
          编译的最后一个步骤,ld命令根据   -llinuxlib      
          选项去寻找liblinuxlib.so    
  )    
  export   LD_LIBRARY_PATH=.    
  (    
          编译时、运行时都需要这个变量的存在    
          编译时如果不存在这个变量,编译依旧通过,但    
          用ldd查看会发现没有动态连接信息    
          运行时如果不存在这个变量,将报告无法找到动态连接库    
   
          这个变量如果不用相对路径".",换了运行环境就比较麻烦    
          export   LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH    
  )    
  gcc   -L.   -lbsd   -llinuxlib   -O3   -o   linuxkiller   linuxkiller.c    
  (    
          -L.   指出除标准库搜索路径之外的库搜索路径,如果不指    
          定,将找不到liblinuxlib.so    
          这个选项并不能代替   LD_LIBRARY_PATH   变量,否则虽然编译通过,    
          但用ldd   linuxkiller的时候会发现没有动态连接信息    
  )    
   
  可以把自己的动态连接库放到/usr/lib或者/lib下去,或者    
  修改/etc/ld.so.conf    
  然后利用/sbin/ldconfig。具体请man   ldconfig    
   
  --    
   
   
  发信人:   hellguard   (小四),   信区:   Unix                  
  标     题:   Re:   help   :static   library----what's   wrong--Thanks.    
  发信站:   BBS   水木清华站   (Thu   Aug   16   14:22:39   2001)    
   
   
  【   在   hululu   (呼噜噜~回家中)   的大作中提到:   】    
  :   I   am   building   a   static   library.   But   I   do   not   know   what   is      
  :   wrong.   Below   is   a   sample:      
  :   tt.c:      
  :   #include   <stdio.h>      
  :   int   func(){      
  :   printf("func   test\n");      
  :   return   0;      
  :   }      
  :   ii.c:      
  :   #include   <stdio.h>      
  :   extern   int   func();      
  :   ...................    
  ★   生成静态链接库举例    
   
          1.   vi   demo.h    
                void   demo   (   void   );    
   
                vi   demo.c    
                #include   <stdio.h>    
                #include   "demo.h"    
                void   demo   (   void   )    
                {    
                        printf(   "hello   world\n"   );    
                        return;    
                }    
   
          2.   g++   -Wstrict-prototypes   -Wall   -Wunused   -O3   -c   demo.c   -o   demo.o    
                file   demo.o    
   
          3.   ar   -rsv   libdemo.a   demo.o    
                a   -   demo.o    
                file   libdemo.a    
                nm   -s   libdemo.a    
                ar   -tv   libdemo.a      
          4.   vi   scz.c    
                #include   <stdio.h>    
                #include   "demo.h"    
                int   main   (   int   argc,   void   *   argv[]   )    
                {    
                        demo();    
                        return   0;    
                }    
   
          5.   g++   scz.c   -L.   -ldemo   -Wstrict-prototypes   -Wall   -Wunused   -O3   -o   scz    

gcc/g++ 链接库的编译与链接 gcc/g++ 链接库的编译与链接 surgewong@gmail.com http://blog.csdn.net/surgewong       程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中,有些公共代码需要反复使用,就把这些代码编译成为“库”文件。在链接步骤中,连接器将从库文件取得所需的代码,复制到生成的可执行文件中,这种库称为静态(链接)库,其特点是可 阅读详情

相关推荐

gcc 编译静态链接库

静态链接库(static library)是目标文件(.o文件或.obj文件)的集合,后缀为.a 在编译使用时,静态库会被拷贝到可执行文件中,所以最终生成的可执行文件不依赖于静态库。但这也使得可执行文件庞大,加载速度慢的问题。另外,一旦修改,就必须重新编译,不能想共享库那样灵活的升级。 本文对gcc编辑静态链接库演示一个示例,供参考,好记星不如烂笔头。 1. 编写代码 编写he

king_on的专栏 6501

用gcc生成.a静态库和.so动态库

通过练习熟练掌握静态库文件与动态库文件的生成。

m0_51592017的博客 1273

2024年最新GCC 编译 C(C++)静态链接库(gcc -L、gcc -l)和动态链接库,2024年最新我先收藏为敬

ar有关ar打包压缩指令,以及rcs各选项的含义和功能,请参考.aWindows.lib其中,xxx代指我们为该库起的名字,比如Linux系统自带的一些静态链接库名称为libc.alibgcc.alibm.a,它们的名称分别为cgcc和m。下面,将greeting.oname.o其中,就是name.ogreeting.o一起打包生成的静态链接库,myfunction是我们自定义的库名。

2401_85011876的博客 1331

如何生成.a库文件

静态库及动态库的建立       UNIX系统及各种软件包为开发人员提供了大量的库文件。但一般情况下这些库文件还       不能足以满足用户的所有需求。开发人员大多会根据他们自己的开发、研究要求编写       出许多函数。对于这些函数,如果都用在命令行中指定源文件的方法同调用它们的程       序链接起来,虽然也是可以的,但也有一些缺点:       .....           下面来看...

张继飞的专栏 1040

Java 开发 修改【冒险岛 079 私服】完整学习流程

第 1-2 天:环境搭建 + 运行原版 079 服务端,能正常登录游戏;第 3-4 天:纯配置文件修改,掌握倍率、属性、怪物、道具的修改,改出第一个「百倍经验私服」;第 5-10 天:Java 代码基础修改,掌握 Player/Skill/Monster 核心类的修改,实现技能无冷却、一刀秒怪、升级满属性;第 11-20 天:Java 代码进阶修改,掌握业务逻辑修改,实现死亡不掉经验、自动捡物、装备强化无失败;第 21-30 天。

萧曳丶 3880

feko金属球远场RCS双站

feko金属球远场RCS双站

a264672的博客 6909

gcc生成静态库.a和动态库.so

gcc生成静态库.a和动态库.so一、用gcc生成静态库和动态库1、 hello实例2、实例一3、实例二二、总结三、参考资料 一、用gcc生成静态库和动态库 1、 hello实例 2、实例一 3、实例二 二、总结 三、参考资料 ...

阿布巴的博客 2980

【QML初学者文档】一问读懂QML基础开发(内附大量简单源码)

QML是Qt的一大特色,拥有强大的UI制作能力。但是想要学好QML,还需要一些细节和技巧的掌握。本篇文章将为你提供完整的QML知识体系,让你成为Qt的UI魔法师!

BenBierBa的博客 2万+

gcc下.a库文件的编译生成和使用

(1)编译生成.o目标文件,如:gcc -c test.c           注:-c选项表示只编译生成.o目标文件. (2)使用ar命令生成.a库文件,如ar -rv libtest.a test.o       注:ar命令可以用来创建、修改库,也可以从库中提出单个模块。     r:在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干 模块中有一个模块在

silent325的专栏 1万+

UFS Write Booster技术解析:原理、配置与故障排查实战

在存储技术领域,缓存机制是提升I/O性能的核心手段之一,其原理是通过高速存储介质暂存数据,减少对低速主存储的直接访问,从而降低延迟、提升吞吐。Write Booster正是这一原理在UFS(通用闪存存储)规范中的具体实现,它通过引入独立的易失性高速缓存区(Write Booster Buffer),将主机写入命令快速响应与后台数据持久化分离,技术价值在于显著改善随机写入性能,消除由垃圾回收等后台操作引发的写入卡顿。该技术广泛应用于智能手机应用安装、相机连拍、固件升级(OTA)等对写入流畅性要求高的场景。本文

weixin_42561143的博客 356

BIOS硬件监控实战:如何手动读取IT8738芯片的温度与风扇数据(附代码)

本文深入探讨了如何绕过操作系统和HWMonitor等监控软件,直接通过寄存器级操作读取IT8738超级I/O芯片的硬件监控数据。文章提供了从动态定位EC空间、构建底层读写函数到解码传感器寄存器映射的完整实战指南,并附有C语言代码示例,帮助开发者理解BIOS硬件监控的底层原理,适用于定制硬件开发与故障诊断。

weixin_29192211的博客 107

Linux下GCC编译过程及静态链接库和动态链接库

一 gcc编译过程 我们知道gcc是一个强大的编译器,很多Linux下的GNU工具都是用C语言写的,并且用gcc编译的,那么gcc的编译过程是怎样的呢,先来看一个总的流程图,我自己简单画的,凑合着看 1首先是源文件经过预加载变成了.i结尾的文件,可以通过-E这个参数来生成这个中间文件,这里主要是把一些include的头文件和一些宏定义,放到源文件中。 2从预加载的文件经过编译就会变成汇编语...

zjy900507的博客 1万+

DISM进行系统修复,进度条卡在63.2%的解决方法

一时用不了软件,安装修复的时候也出现问题 DISM一直卡在63.2%,等了好久时间,直接强制退出寻找最终的解决方案

码农研究僧的博客 1万+

GCC创建和使用静态链接库(.a文件)

Linux 下的静态链接库是以.a结尾的二进制文件,它作为程序的一个模块,在链接期间被组合到程序中。和静态链接库相对的是动态链接库(.so文件),它在程序运行阶段被加载进内存。 制作链接库的目的是希望别人使用我们已经实现的功能,但又不希望别人看到我们的源代码,这对商业机构是非常友好的。 Linux 下静态链接库文件的命名规则为: libxxx.a xxx 表示库的名字。例如,libc.a、libm.a、libieee.a、libgcc.a 都是 Linux 系统自带的静态库。 GCC生成静态链接库 .

hktkfly6的专栏 4899

基于sklearn实现LDA主题模型(附实战案例)

目录LDA主题模型1.LDA主题模型原理2.LDA主题模型推演过程3.sklearn实现LDA主题模型(实战)3.1数据集介绍3.2导入数据3.3分词处理 3.4文本向量化3.5构建LDA模型3.6LDA模型可视化 3.7困惑度 其实说到LDA能想到的有两个含义,一种是线性判别分析(Linear Discriminant Analysis),一种说的是概率主题模型:隐含狄利克雷分布(Latent Dirichlet Allocation,简称LDA)。 现在讨论的是主题模型

m0_64336780的博客 2万+

【TC3xx芯片】TC3xx DMA模块详解

TC3xx DMA模块详解

qq_36056498的博客 5915

Linux GCC编译过程及生成静态链接库和动态链接库

一 gcc编译过程 我们知道gcc是一个强大的编译器,很多Linux下的GNU工具都是用C语言写的,并且用gcc编译的,那么gcc的编译过程是怎样的呢,先来看一个总的流程图,我自己简单画的,凑合着看 1首先是源文件经过预加载变成了.i结尾的文件,可以通过-E这个参数来生成这个中间文件,这里主要是把一些include的头文件和一些宏定义,放到源文件中。 2从预加载的文件经过编译就会变成汇编语言的文件,这一步可以通过-S这个参数来生成这个中间文件 3从汇编语言的文件通过汇编,就会变成目标代码.o的文件...

2148

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Linux GCC编译使用动态、静态链接库

在windows下动态链接库是以.dll后缀的文件,二在Linux中,是以.so作后缀的文件。 动态链接库的好处就是节省内存空间。 1、Linux下创建动态链接库 在使用GCC编译程序时,只需加上-shared选项即可,这样生成的执行程序即为动态链接库。 例如有文件:hello.c x.h main.c 编译:gcc hello.c -fPIC -o libhello.so

God's blog 7万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

7、用 GCC 制作静态、动态链接库

用 GCC 制作静态、动态链接库

融码一生:专注 Python、C/C++、Linux、机器学习 & 深度学习、NLP、算法领域分享 1897

GCC编译过程与动态链接库和静态链接库

1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。 windows上对应的是.lib .dll linux上对应的是.a .so 在这里先介绍下Linux下的gcc编译的几个选项 g++ -c hellospeak.cpp 会将hellospeak.cpp

qq_36075612的博客 3187

GCC生成动态链接库.so库和静态链接库.a库

我们以上以节中的C语言写的线程池为例,包括三个文件:thread_pool.cpp、thread_pool.h、test.cpp,把线程池组件thread_pool.cpp封装为一个动态链接库或者静态链接库。 1、编译生成动态链接库(参考) (1)编译生成.so库 g++ -w thread_pool.cpp -fPIC -shared -o libthread_pool.so ...

蓬莱道人的博客 3831

静态链接库

库 库的存在,大大方便了我们进行编程。因为有了库,我们不必再从0开始,例如我们大多数人C语言写的第一个程序Hello World!都是用了库函数。以printf为例,我们只需要在程序源代码中包含<stdio.h>这个头文件之后,就可以使用printf函数了。这极大的方便了编程。同时库所带来的好处在于,头文件和库文件相结合的访问机制。有时候我们只想让别人使用自己实现的功能,并不想公开实现功能的源码,就可以将其制作为库文件,这样用户获取到的是二进制文件,而头文件又只包含声明部分,这样就实现了“将源

zy010101博客 4059

使用GCC(MinGW)编译静态链接库

简单记录一下尝试移植Linux上的precice多物理场耦合项目到Windows时学习GCC的操作方案。

Ian321的博客 1544

gcc编译链接库并调用链接库的方法

linux系统下gcc编译静态链接库和动态链接库的方法

u010851789的博客 3075

gcc编译生成动态链接库,静态库步骤

废话不说,直接干货: 首先touch三个文件test.h,test.c,main.c test.c文件内容: int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int mul(int a, int b) { return a * b; } int div(int a,

Code Young 的博客 2271
上一篇: UITextField和UITextView iOS中的输入框
下一篇: 算法思想常用网站
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值