Linux库概念及如何制作静态库和动态库

  • 1: gcc编译的过程
  • 2: 分文件编程
  • 3: 库(静态库和动态库)
    • 3.1: 库的基本介绍
    • 3.2: 静态和动态库的区别
    • 3.3: 库的制作及使用
      • 3.3.1: 静态库制作
      • 3.3.2: 动态库制作

1: gcc编译的过程

1 预处理: 处理所有以#开头的代码,包括头文件、宏定义、条件编译

gcc -E hello.c -o hello.i

2 编译: 语法检查以及将C语言转成汇编语言

gcc -S hello.i -o hello.s

3 汇编: 将汇编语言转成二进制文件

gcc -c hello.s -o hello.o

4 链接: 链接代码需要用到其他文件(库文件等)

gcc hello.o -o hello

参数的介绍

参数介绍-E:          只进行预编译,不做其他处理
-c:         只是编译不链接 生成目标文件 .o
-S:         只是编译不汇编 生成汇编代码
-g:         在可执行程序中包含标准调试信息
-o file     输出文件 到 file 这个文件中
-v:         打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir:     在头文件的搜索路径列表中添加dir目录
-L dir:     在库文件的搜索路径列表中添加dir目录
-static     链接静态库
-l library  链接名为library的库文件

2: 分文件编程

如果玩过单片机啥的都会知道,当你的代码写的很多,一般分文件写就会更好的阅读,或者说各个模块都分别有一个.c 和.h的代码。或者就是大家合作做东西,都会分开 各做各的,然后给你接口你去使用。
比如你做一个项目 避障智能小车
网络: A同学
超声波: B同学
电机: C同学
好处:分模块的编程思想
a.分工明确(功能责任划分)、b.方便调试、c.主程序简洁
分文件编程步骤:

1.写一个调用的函数 add.c

#include "add.h"int add(int num1,int num2)
{return (num1+num2);
}

2.声明函数 add.h

#ifndef __ADD_H
#define __ADD_Hint add(int num1,int num2);#endif

3.main函数(主程序入口)

#include <stdio.h>
#include "add.h"int main()
{int ret = add(1,2);printf("ret = %d\n",ret);return 0;
}

4.编译main函数的和 函数的一起编译。

gcc main.c add.c -o main

5.运行程序

./main

3: 库(静态库和动态库)

3.1: 库的基本介绍

共享库,静态库,动态库相关资料参考来源网址

3.2: 静态和动态库的区别

1.静态库

静态函数库: 是在程序执行前(编译)就加入到目标程序中去了;

优点:
1. 运行快,
2. 静态库被打包到应用程序中加载速度快。
3. 发布程序无需提供静态库,因为已经在APP中,移植方便。

缺点:
1. 程序大
2. 更新,部署,发布麻烦(一更新就要往厂家发)
3. 链接时完整地拷贝至可执行文件中,别多次使用就有多份冗余拷贝。

2.动态库

动态函数库: 是在程序执行时动态(临时)由目标程序去调用;

优点:
1. 程序小
2. 链接时不复制,程序运行时由系统动态加载到内存,供内存调用,系统只加载一次,多个程序可以共用,节省内存。
3.程序升级简单,因为APP里面没有库的源代码,升级之后只要库名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。

缺点:
1. 运行慢
2. 加载速度比静态库慢
3. 发布程序需要提供依赖的动态库。

3.3: 库的制作及使用

3.3.1: 静态库制作

静态库文件名格式:        libxxx.a
库名前加lib
库的名称xxx
库名后缀.a

0-首先我们写几个代码
main.c

void func1();
void func2();int main()
{func1();func2();return 0;
}

func1.c

#include <stdio.h>void func1()
{printf("This is func1\n");
}

func2.c

#include <stdio.h>void func2()
{printf("This is func2\n");
}

步骤1:将func1.c func2.c 编译成二进制 (.o文件)

我们在编译程序的时候在加一个 -c

gcc -c func1.c func2.c

这样会得到两个.o文件 分别是 func1.o func2.o

步骤2:然后将这两个.o文件生成静态库
名字随意,我这里就叫 my_static 吧

ar -crv libmy_static.a   func1.o func2.o

或者

ar  rcs libmy_static.a  func1.o func2.o

注意:
静态库是.a结尾

这样你会得到了一个名字叫 libmy_static.a 的文件

步骤3:编译main

gcc main.c -o main -L . -l my_static
-L:          是指告诉gcc编译器先从-L指定的路径去找静态库,
. :         是当前路径的意思
my_static:  是我最后想生成的文件名(这里可随意起名字)

完整步骤

3.3.2: 动态库制作

步骤1:直接对.c文件生成.so文件
比如我这里就叫 my_synamic 吧

gcc -fPIC -shared -o libmy_dynamic.so func1.c func2.c

或者

gcc -fpic -shared libmy_dynamic.so func1.c func2.c
-fPIC:       选项作用于编译阶段,在生成目标文件时就得使用该选项,
以生成位置无关的代码。
-shared:    指定生成动态库

步骤2:编译成可执行文件

gcc main.c -o main -L . -l my_synamic

步骤3:运行main程序
这里就和静态库不一样了,不能直接运行。

参考来源网址

方法一(很少用):
把.so 结尾的文件拷贝到 /usr/lib/中去或者 ldd命令查看一下得到的位置(得切换会超级用户 在前面加sudo)

ldd main


我这里默认是去 /lib/x86_64-linux-gnu 找的,所以我们可以直接把我们的动态库放到那里去。

sudo cp libmy_dynamic.so /usr/lib/

sudo cp libmy_dynamic.so /lib/x86_64-linux-gnu/

这样就可以直接运行了

方法二:(推荐)
1.添加指令:export LD_LIBRARY_PATH=”路径”
例如 :

export LD_LIBRARY_PATH=/home/pikaqiu/linux_c/library/dynamicLibMake

路径可以通过输入命令pwd查看
但是这种也是有点缺陷,就是你换了一个窗口就没办法运行了

所以直接写一个脚本。
start.sh

export LD_LIBRARY_PATH=/home/pikaqiu/linux_c/library/dynamicLibMake/./main

给 脚本 可执行权限

chmod +x start.sh

运行

./start.sh

这样不管换了新的窗口我们直接运行脚本就可以了.

Linux gcc编译过程及动态/静态库制作相关推荐

  1. linux centos 编译Lua5.2.0 静态库 动态库

    一 lua下载 lua5.2.0下载地址 :http://download.csdn.net/download/yzf279533105/10109818 二 笔者这里linux环境为centos6. ...

  2. MacOSX64位机器上gcc编译32位x264静态库

    x264最新包地址:http://www.videolan.org/developers/x264.html 编译命令: ./configure --enable-static --host=i386 ...

  3. GCC : 什么是编译?什么是静态库?什么是动态库?怎么生成?优先级?

    本文旨在让大家真正明白C程序如何运行.库文件的种类区别.如何生成.如何使用等! 一.简介: gcc 最初是 "GNU C Compiler" 的简称,只是当作一个 C 语言的编译器 ...

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

    1. 库的介绍 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可 ...

  5. 在Linux下如何使用GCC编译程序、简单生成静态库及动态库。

    在Linux下如何使用GCC编译程序.简单生成 静态库及动态库.   本文适用于Linux下开发初学者.本文初步讲解在Linux下如何使用GCC编译程序.简单生成静态库及动态库. 一.关于安装.一般系 ...

  6. 浅析Linux下gcc编译过程

    目录 1. gcc简介及基本用法 2. gcc编译过程 3. 静态链接和动态链接 4. 静态库和动态库 4.1 静态库的制作和使用 4.2 动态库的制作和使用 1. gcc简介及基本用法   GCC( ...

  7. Linux下动态库和静态库制作与调用

    Linux下动态库和静态库制作与调用 1.动态库和静态库简介   静态库是指在应用中,有一些公共代码需要反复使用,就把这些代码编译为"库"文件:在链接步骤中,连接器将从库文件取得所 ...

  8. 技巧:Linux 动态库与静态库制作及使用详解

    http://www.ibm.com/developerworks/cn/linux/l-cn-linklib/ 技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用 ...

  9. 动态库、静态库编译测试:含静态库链接动态库、静态库,动态库链接静态库、动态库

    本文的目的是测试各种类型库的编译后的使用效果,包括库又链接其他库的编译方法,使用方法,依赖性等. 太长不看版:请跳至文章最后的总结对比表. 一.内容包含: ①静态库libbb.a依赖静态库libaa. ...

最新文章

  1. dubbo服务接口如何mock_2019年Dubbo你掌握的如何?快看看这30道高频面试题!
  2. VTK:相互作用之RubberBand2D
  3. aspx练习备忘录#想锤自己两拳#1
  4. 使用yarn安装quasar,quasar创建新项目 出错error eslint
  5. 微信小程序开发之路(一)
  6. python离群点检测_如何从熊猫DataFrame中检测峰点(离群值)
  7. 2020非全日计算机博士,在职攻读博士是不是非常难,免考在职博士和非全日博士有什么不同...
  8. 新版本ISR 为啥 移除replica.lag.max.messages这个参数
  9. mysql可以存储整数数值的是_MySQL知识树 数值类型 整数
  10. Duplicate entry 'xxx' for key 'xxx'
  11. “真正的机器人测试” - 淘宝泛终端机器人自动化测试实践
  12. VC操作Word书签模板
  13. bzoj4453 cys就是要拿英魂!(后缀数组+单调栈+二分)
  14. 给定经纬度定位某个城市
  15. php 判断字符串类型及长度
  16. 利用stm32f103c8t6实现对WS2812的控制(从硬件出发)
  17. 速卖通教你如何提升店铺转化率——测评补单
  18. 华为OD机试 - 相对开音节 | 备考思路,刷题要点,答疑 【新解法】
  19. R语言 向量排序与运算
  20. fastjson 如何去掉反斜杠

热门文章

  1. 网络测速软件IPERF
  2. 【安卓】Android播放器的三种实现方法
  3. Design an Instagram
  4. 优酷在线播放器 html5,GitHub - esterTion/Youku-HTML5-Player: 一个适配优酷的简单易用的HTML5播放器...
  5. 城市地标新名片 LED透明屏价值跃升为建筑传媒溢彩
  6. 禁止windows系统创建快捷方式时添加文字“- 快捷方式”
  7. 计算机用于材料科学模拟,材料科学行为工艺的计算机模拟.ppt
  8. python交流企鹅裙_神级程序员巧用python开发王者荣耀把妹神器,一路升级上王者!...
  9. JAVAscript实现萤火虫----面向对象
  10. 点击qq或者微信对话框里面的文件跳转到自己的app时的文件路径问题