开发一个应用程序不可避免要使用多个第三方库(library).
默认情况下,gcc采用动态连接的方式连接第三方库,比如指定-lpng,连接程序就会去找libpng.so

gcc提供了一个-static参数,可以改变gcc默认的连接方式,GNU官网上关于gcc连接选项的手册《3.14 Options for Linking》中有说明:如下

这个-static选项是个大杀器,指定了这个选项,gcc在连接时对项目所有的依赖库都尝试去搜索名为lib<name>.a的静态库文件,完成静态连接,如果找不到就报错了。这里指的所有是不仅指我们常用的第三方库比如jpeg,png,opencv,zlib,...,还包括gcc编译器自带的库libgcc,libstdc++,libc,libm...,总之就是linux kernal之外的所有库。而且还要包括所有被间接引用的第三方库,比如png这个库在编译时还用到了zlib,那么静态连接png的时候,就要带上zlib的库:-lpng -lz,

这可麻烦大了,要把这些东西全静态连接,这得有多大?呵呵,这事儿我干过,十几兆字节总是有的,取决你的程序用到多少第三方库。
这种全静态连接有啥用处呢?也有用,就是你的程序自带干粮,只需要一个linux kernal就能跑了。

但是实际应用中,我们绝大多数应用场景不需要这么做,即使在嵌入式系统中也不一定必要,尤其是嵌入式系统的存储容量受限,这么一只大象装都装不下。所以我们大多数情况下需要有选择的进行静态编译,-static并不适合。

如何有选择的进行静态编译呢?

最简单的方式直接在连接参数中以全路径指定连接库就好了: your/path/lib<name>.a
但这种形式对管理结构简单而且自己写Makefile的小型项目还好,当一个项目结构复杂,有时需要静态连接有时需要动态连接,这种频繁的修改编译脚本的方式,可维护性就太差了。

-Bstatic

gnu的连接程序ld提供了一个-Bstatic选项用于对指定的库静态连接,ld的官方手册《2.1 Command Line Options》有说明,如下:

大意就是-Bstatic参数指定对跟在它后面的所有库执行静态连接,如下就指定LDFLAGSpng这个库静态连接,ld会自动去搜索libpng.a

-Bstatic -lpng -lz

-l:filename

如果你觉得上面一种静态连接方式不适合你,可以看看ld的官方手册《2.1 Command Line Options》中关于-l参数的说明,如下:

注意上面的说明中红框标注的内容,如果-l:filename格式指定一个文件名,连接程序直接去找这个文件名了,不会再像使用-lname时将name扩展成lib<name>.a格式的文件名.
所以使用 -l:libpng.a这样的形式来指定连接库,就指定了静态连接png库。
当然如果库的位置不在gcc默认搜索路径中,要用-L参数另外指定搜索库的路径,否则连接程序不知道该从哪里找到filename

-L/your/library/path -l:libmylib.a

顺便贴出ld的官方手册《2.1 Command Line Options》中关于-L参数的说明

参考资料

以上内容只是我对最近做项目编译的一些总结和体会,可能会有所遗漏,权威资料还请参见gcc的官方文档
《3.14 Options for Linking》
《2.1 Command Line Options》

linux gcc 链接静态库的几种方式相关推荐

  1. Linux gcc 制作静态库01

    制作步骤 编译为 .o 文件 createliba目录下 结构为 ├── head │ └── test.h ├── jia.c ├── jian.c ├── cheng.c ├── chu.c 这4 ...

  2. Linux下的静态库、动态库和动态加载库

    from: http://www.techug.com/linux-static-lib-dynamic-lib 库的存在极大的提高了C/C++程序的复用性,但是库对于初学者来说有些难以驾驭,本文从L ...

  3. dlopen linux 实例_Linux静态库和动态库

    库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大 ...

  4. 在Linux中创建静态库.a和动态库.so

    转自:http://www.cnblogs.com/laojie4321/archive/2012/03/28/2421056.html 在Linux中创建静态库.a和动态库.so 我们通常把一些公用 ...

  5. linux下生成静态库和动态库

    linux下生成静态库和动态库 一.动态库.静态库简介 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常.本质上 ...

  6. GCC生成静态库和动态库

    目录 1)阅读.理解和学习材料"用gcc生成静态库和动态库.pdf"和"静态库.a与.so库文件的生成与使用.pdf",请在Linux系统(Ubuntu)下如实 ...

  7. Linux下动静态库的打包与使用C C++

    目录 前言 为什么用动静态库 动态链接与静态链接 底层优缺点 Linux下的动静态库 动静态库的对比 打包静态库 使用静态库 打包动态库 使用动态库 小结 win下打包动静态库 前言 为什么用动静态库 ...

  8. gcc创建静态库和共享库

    静态库和动态(共享)库 静态库:编译程序在编译使用库提供的功能代码的程序时将代码复制到该程序然后编译成可执行程序,这种库成为静态库 共享库:共享库比静态库的处理方式更加灵活,因而其产生的可执行文件更小 ...

  9. linux下的静态库与动态库

    目录 静态库 定义: 生成及使用方法: 静态库的优缺点 动态库 定义: 生成及使用方法: 动态库优缺点: 静态库 先说说我们为什么需要库? 当有些代码我们大量会在程序中使用比如(scanf,print ...

最新文章

  1. NOI2003文本编辑器
  2. ubuntu 13.04 安装 GRUB customizer
  3. 足球动图gif(一)
  4. Angular路由开发的一个实际例子
  5. opencv之划痕缺陷检测
  6. WPS简历模板的图标怎么修改_新媒体运营-简历模板范文,【工作经历+项目经验+自我评价】怎么写?...
  7. ios根据服务器修改App名称,iOS 修改APP工程名字
  8. 没有U盘怎么重装系统 无U盘重装系统教程
  9. can总线一帧多少字节多少位_汽车CAN总线数据帧解析---汽车语言知多少
  10. 蓝桥 字符串跳步 JAVA
  11. 【FFmpeg编程进阶】(13)FLV 解码器初始化函数 ff_h263_decode_init() 代码分析 --- 待更新
  12. 用python祝福父亲节_父亲节送给父亲的祝福语,挑一句话发朋友圈!
  13. 旁门左道:让移动游戏在APP Store下载量暴涨的邪门功夫
  14. Pandas中常见的20多种数据筛选方法,116张图详解 | 图解Pandas-图文第8篇
  15. 计算机网络英语版答案,计算机网络试卷英语版
  16. 爬虫图片mysql_爬取微博图片数据存到Mysql中遇到的各种坑\爬取微博图片\Mysql存储图片\微博爬虫...
  17. 美国大力发展量子产业,国会直接指定能源部制定量子系统访问路线图
  18. git解决代码冲突、合并代码
  19. 实施工程师的发展方向
  20. MSP430F5529LCD1602程序

热门文章

  1. 程序可以下载,在线调试disassembly窗口就出现了大片0x00000000 FFFFFFFF DCD 0xFFFFFFFF ; ? Undefined
  2. 关于--Error: User Command terminated, Exit-Code = 1解决办法
  3. Rust 1.33.0 发布,OSC 上堪称“零差评”的编程语言
  4. cookie之登录用户凭证
  5. nginx进阶-动静分离,负载均衡
  6. 软工概论第十三周总结
  7. 私房库视频学习笔记-小清新BBS系统开发技术归纳
  8. ADO.NET笔记——带参数的查询防止SQL注入攻击
  9. cropped-img_2692.jpg
  10. 在vmware esx平台创建windows 2003 server群集时无法找到共享磁盘的解决方法