Linux的静态函数库和动态函数库

一、在Linux中,有两种函数库,以*.so后缀命名的是动态函数库,以*.a后缀命名的是静态函数库

  对于静态函数库:在编译链接时候,程序所需要的函数会从静态函数库中拷贝到执行文件中。当程序运行的时候,就不需要链接外部的函数库了。

  对于动态函数库:在编译链接时,程序所需要的函数不会从动态函数库中拷贝出来,而是在程序运行的时候,才会将所需要的函数加载进来。

二、静态函数库

  1、静态函数库是多个目标文件*.o的集合

  2、可以使用ar命令(archiver)来生成.a文件

  gcc -c part_a.c
  gcc -c part_b.c
  ar -r libtest.a part_a.o part_b.o

  3、若要使用静态函数库中的函数,只需包含这些函数的声明头文件,并在编译时候指明静态函数库的名字,编译器会自从将函数拷贝到目标文件中。

  4、生成的函数库的命名规范为:lib+函数库名。如,要生成一个test的函数库,则命名为libtest.a

  示例:

  (1)、分别创建三个文件:main.c、part_a.c、part_b.c

#include <stdio.h>
#include "part_a.h"

int print_part_a(void)
{
    printf("part A\n");
    return 0;
}
#include <stdio.h>
#include "part_b.h"

int print_part_b(void)
{
        printf("part B\n");
    return 0;
}
#include <stdio.h>
#include "part_a.h"
#include "part_b.h"

int main(void)
{
    print_part_a();
    print_part_b();
    return 0;
}

  (2)、这里,我们创建三个目录:src、include、lib,分别存放源文件、头文件、库文件,然后生成的目标文件就存放在当前目录

  (3)、编写Makefile

INCLUDE += -I./include
SRC += ./src
LIB += ./lib

LIB_FILE += $(LIB)/libtest

all: lib
    gcc $(INCLUDE) -o main $(SRC)/main.c -L$(LIB) -ltest        

lib: $(SRC)/part_a.o $(SRC)/part_b.o
    ar -r $(LIB_FILE).a $(FILE_A_OBJ) $(FILE_B_OBJ)    

$(SRC)/part_a.o: $(SRC)/part_a.c
    gcc $(INCLUDE) -c $(SRC)/part_a.c

$(SRC)/part_b.o: $(SRC)/part_b.c
    gcc $(INCLUDE) -c $(SRC)/part_b.c

  (4)、执行./main文件,就会先后打印print_part_a()函数和print_part_b()函数的内容了

   分析:我们用命令objdump -S main和objdump -S libtest.a进行反汇编查看可知,此时可执行文件main中已经拷贝了静态函数库的函数了。    

                     

三、动态函数库(暂无。。)

四、本文用到的命令及相关参数

  gcc命令相关参数分析:

  1、-Idirname :-I (注:是大I)可以指定头文件路径为dirname(./表示当前路径   ../表示上一级目录),并将其加入到程序头文件目录列表中。

    例如:假设头文件所在的目录为include,那么输入参数就为:-I ./include

  2、-c :(注:是小c)只进行预编译、汇编,生成目标文件.o

  3、-Ldirname:-L 将所指出的目录dirname加入到程序函数库的目标列表中,即告诉链接脚本先到-L指定的目录中寻找,然后到系统默认路径中寻找。

    例如:指定当前目录,则输入参数为:-L .

  4、-lname:-l (注:是小L)可以指定链接时装载名为libname.a的函数库。

    例如:若需要一个名为libtest.a的函数库,则输入参数为:-ltest

  ar命令相关参数分析:

  1、-r:将文件插入到库文件中

  2、-c:建立库文件

  3、-t:显示库文件中所包含的文件

  4、-d:删除库文件中指定的成员文件

原文地址:https://www.cnblogs.com/Recca/p/11385827.html

时间: 2024-08-29 02:10:00

Linux的静态函数库和动态函数库的相关文章

静态函数库和动态函数库

静态函数库是在编译链接时,把库文件代码全部加入到可执行文件中,因此生成的文件比较大,而运行时也就不需要库文件了.Linux中静态函数库的后缀名一般为".a",windows中为".Lib": 动态函数库是在编译链接时没有把库文件代码加入到可执行文件中,而是将要调用的函数所在文件的和该函数在文件中的位置等信息链接进目标程序.Linux中动态函数库的后缀名一般为".so",windows中为".dll".

C语言的动态函数库和静态函数库的生成和使用(linux环境下)

软件开发往往是一个十分庞大的工程.需要消耗大量的脑力.借助别人已经开发好的库,往往能提高效率,下面将介绍如何开发和使用共享的库文件.使用别人已经开发好的库,就像是我们想要建造一辆汽车十分困难,但是如果汽车的各大部件都已经存在并且可以获得,我们要做的工作就是组装,组装过程一定比设计这些部件要轻松. 函数库分为两种静态(static)函数库和动态(shared)函数库.两者都是函数的集合.区别:在编译的时候会把静态函数库的内容加到目标程序中,目标程序具有函数库的代码;而动态函数库是在执行的时候才把函

Linux中的动态函数库和静态函数库的比较

库函数既提高了代码的利用率,又屏蔽了函数内部实现的细节,给不同开发者提供了统一的接口.从实现来看,库函数可以分为动态函数库和静态函数库.同一组函数,可以根据需要封装成静态库和动态库.那么生成静态库和动态库有什么区别?静态库和动态库对函数的实现上各有些什么要求?两者对内存各有什么影响呢?下面就带着这些问题一起开探讨. 静态库和动态库生成方式的区别为了简化,下面以一个只有一个函数的库的实现来说明.库函数的代码demo.c如下:/************************************

Linux 静态链接库和动态连接库

(0)文件夹 VMware 下安装Ubuntu的吐血经历 零基础学习Shell编程 Linux下的makefile的妙用 Linux调试神器 -- gdb 十分钟学会Python的基本类型 Linux 静态链接库和动态连接库 一:静态链接库的应用  三步走~~~ ##g++ -c StaticMath.cpp ##ar -crv libstaticmath.a StaticMath.o ##g++ -o run test_a.cpp -L. -lstaticmath #[@sjs_37_33 l

动态函数库的制作和使用

>>>>>>接静态函数库的制作和使用>>http://www.cnblogs.com/hfxin2001-eric-daddy/p/5809010.html 2 动态函数库的制作和使用 动态函数库的制作步骤可以用下图来描述,具体包括 (1)  编写函数的.c文件(例如add.c.sub.c.mul.c和div.c) (2)  编写Makefile,然后make,实现函数的编译和归档入库 函数的编译:使用gcc –c add.c -fPIC只编译不链接函数.c

动态函数库设计

动态链接库,当程序运行起来后,如果程序中需要使用到某个动态库函数,则系统就会从磁盘中将该库函数动态的加载到内存中. 1)“-c”选项编译taxlib.c文件并输出taxlib.o目标文件.gcc -c taxlib.c -o taxlib.o 2)将taxlib.o制作成动态链接库,执行命令:gcc -shared -fPIC taxlib.o -o libtaxlib.so 3)将libtaxlib.so动态链接库 文件复制到/usr/lib目录下. 4)编译mytax.c文件,gcc myt

9、动态函数库设计

制作动态 1. gcc –c mylib.c –o mylib.o 2. gcc -shared -fPIC mylib.o -o libmylib.so 3. 将制作好的libmylib.so 复制到/usr/lib-fpic 使输出的对象模块是按照可重定位地址方式生成-fpic 使输出的对象模块是按照可重定位地址方式生成的. -shared 指明产生动态链接 原文地址:https://www.cnblogs.com/earwen/p/10421215.html

linux 动态静态库

库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种.  1  静态库和动态库的区别1.1. 静态函数库    (1)静态函数库的名字一般是lib[name].a(2)利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,它的优点是编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.这给它带来的缺点为如果静态函数库改变了,那么你的程序必须重新编译.1.2. 动态函数库    (1)动态函数库的名字一般是li

(笔记)Linux下的静态库和动态库使用详解

库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 一.静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了.当 然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译. 2. 动态函数库 这类库的名字一般是libxxx.so;相对于