精华内容
下载资源
问答
  • Linux静态库/动态库/makefile/gdp
    千次阅读
    2022-04-09 15:46:51

    理解动态库

    1.动态库是程序运行时加载的库,运行的多个程序可使用同一个加载到内存中的动态库,故动态库也称共享库。动态库是目标文件的集合比如多个.o文件
    2.库中函数和变量的地址使用的是相对地址,静态库使用绝对地址。动态库真实地址在应用程序加载动态库时形成
    动态库格式libxxx.so

    生成动态链接库

    更多相关内容
  • LINUX静态库.a嵌套.a文件,二次封装,完整源码,演示项目齐全
  • 本篇文章是对Linux静态库与动态库进行了详细的分析介绍,需要的朋友参考下
  • linux静态库和动态库

    2015-04-03 22:53:28
    linux静态库和动态库的区别
  • 静态库:在编译阶段加载(将库文件的代码加载到源文件) 动态库:在运行时加载 3.生成可执行文件存在的区别(优缺点) (1)使用静态库生成的可执行文件大于动态库生成的可执行文件(程序占用的内存较多) (2)使用...
  •  linux下的库有两种:静态库和共享库(动态库)。  二者的不同点在于代码被载入的时刻不同。  静态库的代码在编译过程中已经被载入可执行程序,因此体积较大。  共享库的代码是在可执行程序运行时才载入内存...
  • 有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。本文介绍了使用的方法,分析了动态的路径问题,介绍了查看中的符号的方式。
  • Linux静态库与动态库实例详解 1. Linux 下静态链接库编译与使用 首先编写如下代码: // main.c #include test.h int main(){ test(); return 0; } // test.h #include using namespace std; void test(); // test...
  • 简介在linux下库分两种:静态库和共享(动态)库。这两种库的主要不同在于连接到程序的过程。在编译程序时,连接器(ld)负责把程序中不同的模块连接起来,产生最终的可执行文件。静态库就是在这一过程连接到程序,成为...

    简介

    在linux下库分两种:静态库和共享(动态)库。这两种库的主要不同在于连接到程序的过程。

    在编译程序时,连接器(ld)负责把程序中不同的模块连接起来,产生最终的可执行文件。静态库就是在这一过程连接到程序,成为程序的一部分。共享库与此不同,在编译时加入程序的只是一些钩子,在程序运行的时候才需要把共享库调入以便运行。

    创建和使用静态库

    创建静态库:通常使用ar程序把一些目标文件(.o)组合在一起,成为一个单独的库,然后运行ranlib,以给库加入一些索引信息。

    在本节使用如下的代码完成一个基本hello wold程序:

    say_hello.h

    #ifndef _SAY_HELLO_

    #define _SAY_HELLO_

    void say_hello ();

    #endif

    say_hello.cpp

    #include "say_hello.h"

    #include

    using std::cout;

    void say_hello ()

    {

    cout << "hello ";

    }

    say_wolrd.h

    #ifndef _SAY_WORLD_

    #define _SAY_WORLD_

    void say_world ();

    #endif

    say_world.cpp

    #include

    #include "say_world.h"

    using std::cout;

    using std::endl;

    void say_world ()

    {

    cout << "world" << endl;

    }

    main.cpp

    #include "say_hello.h"

    #include "say_world.h"

    int main ()

    {

    say_hello ();

    say_world ();

    }

    生成库和使用库的步骤如下:

    使用g++ -c生成目标文件(.o)

    g++ -c -o say_hello.o say_hello.cpp

    g++ -c -o say_world.o say_world.cpp

    使用ar rc归档为库文件

    ar rc libhelloworld.a say_hello.o say_world.o

    使用ranlib生成索引

    ranlib libhelloworld.a

    使用库

    g++ -o main main.cpp -L. -lhelloworld

    -L. 告诉连接器在当前目录查找库文件;-l 选项指定连接的库,这里省略前缀lib和文件名后缀.a

    0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • Linux 静态库 编译和使用

    千次阅读 2022-01-01 23:58:34
    前言: 不管是 Linux 还是 Windows 中的库文件其本质和工作模式都是相同的,只不过在不同的平台上库对应的...在 Linux静态库以 lib 作为前缀,以.a 作为后缀,中间是库的名字自己指定即可,即: libxxx.a 在 Windo

    前言:

    不管是 Linux 还是 Windows 中的库文件其本质和工作模式都是相同的,只不过在不同的平台上库对应的文件格式和文件后缀不同。程序中调用的库是 静态库
    在项目中使用库一般有两个目的,一个是为了使程序更加简洁不需要在项目中维护太多的源文件,另一方面是为了源代码保密,毕竟不是所有人都想把自己编写的程序开源出来。

    静态库:

    在 Linux 中静态库由程序 ar 生成。

    在 Linux 中静态库以 lib 作为前缀,以.a 作为后缀,中间是库的名字自己指定即可,即: libxxx.a
    在 Windows 中静态库一般以 lib 作为前缀,以 lib 作为后缀,中间是库的名字需要自己指定,即: libxxx.lib
    

    llinux 中 生成静态库,需要先对源文件进行汇编操作 (使用参数 -c) 得到二进制格式的目标文件 (.o 格式), 然后在通过 ar 工具将目标文件打包就可以得到静态库文件了 (libxxx.a)

    生成静态链接库的具体步骤如下:

    1. 需要将源文件进行汇编,得到 .o 文件,需要使用参数 -c。
    # 执行如下操作, 默认生成二进制的 .o 文件
    # -c 参数位置没有要求
     gcc 源文件(*.c) -c	
    
    1. 将得到的 .o 进行打包,得到静态库。
     ar rcs 静态库的名字(libxxx.a) 原材料(*.o)
    
    1. 发布静态库
    # 发布静态库
    	1. 提供头文件 **.h
    	2. 提供制作出来的静态库 libxxx.a
    

    静态库制作举例:

    在某个目录中有如下的源文件,用来实现一个简单的计算器

    # 目录结构 add.c div.c mult.c sub.c -> 算法的源文件, 函数声明在头文件 head.h
    # main.c中是对接口的测试程序, 制作库的时候不需要将 main.c 算进去
    .
    ├── add.c
    ├── div.c
    ├── include
    │   └── head.h
    ├── main.c
    ├── mult.c
    └── sub.c
    

    源代码如下:

    加法计算源文件 add.c:

    加法计算源文件 
    #include <stdio.h>
    #include "head.h"
    
    int add(int a, int b)
    {
        return a+b;
    }
    

    减法计算源文件 sub.c:

    #include <stdio.h>
    #include "head.h"
    
    int subtract(int a, int b)
    {
        return a-b;
    }
    

    乘法计算源文件 mult.c:

    #include <stdio.h>
    #include "head.h"
    
    int multiply(int a, int b)
    {
        return a*b;
    }
    

    减法计算的源文件 div.c:

    #include <stdio.h>
    #include "head.h"
    
    double divide(int a, int b)
    {
        return (double)a/b;
    }
    

    头文件 head.h

    #ifndef _HEAD_H
    #define _HEAD_H
    // 加法
    int add(int a, int b);
    // 减法
    int subtract(int a, int b);
    // 乘法
    int multiply(int a, int b);
    // 除法
    double divide(int a, int b);
    #endif
    

    测试文件 main.c

    #include <stdio.h>
    #include "head.h"
    
    int main()
    {
        int a = 20;
        int b = 12;
        printf("a = %d, b = %d\n", a, b);
        printf("a + b = %d\n", add(a, b));
        printf("a - b = %d\n", subtract(a, b));
        printf("a * b = %d\n", multiply(a, b));
        printf("a / b = %f\n", divide(a, b));
        return 0;
    }
    

    静态库生成:
    第一步:将源文件 add.c, div.c, mult.c, sub.c 进行汇编,得到二进制目标文件 add.o, div.o, mult.o, sub.o

    # 1. 生成.o
    $ gcc add.c div.c mult.c sub.c -c
    sub.c:2:18: fatal error: head.h: No such file or directory
    compilation terminated.
    
    # 提示头文件找不到, 添加参数 -I 重新头文件路径即可
    $ gcc add.c div.c mult.c sub.c -c -I ./include/
    
    # 查看目标文件是否已经生成
    $ tree
    .
    ├── add.c
    ├── add.o            # 目标文件
    ├── div.c
    ├── div.o            # 目标文件
    ├── include
    │   └── head.h
    ├── main.c
    ├── mult.c
    ├── mult.o           # 目标文件
    ├── sub.c
    └── sub.o            # 目标文件
    

    第二步:将生成的目标文件通过 ar 工具打包生成静态库

    # 2. 将生成的目标文件 .o 打包成静态库
    $ ar rcs libcalc.a a.o b.o c.o    # a.o b.o c.o在同一个目录中可以写成 *.o
    
    # 查看目录中的文件
    $ tree
    .
    ├── add.c
    ├── add.o
    ├── div.c
    ├── div.o
    ├── include
    │   └── `head.h  ===> 和静态库一并发布
    ├── `libcalc.a   ===> 生成的静态库
    ├── main.c
    ├── mult.c
    ├── mult.o
    ├── sub.c
    └── sub.o
    

    第三步:将生成的的静态库 libcalc.a 和库对应的头文件 head.h 一并发布给使用者就可以了。

    # 3. 发布静态库
    	1. head.h    => 函数声明
    	2. libcalc.a => 函数定义(二进制格式)
    

    静态库的使用

    当我们得到了一个可用的静态库之后,需要将其放到一个目录中,然后根据得到的头文件编写测试代码,对静态库中的函数进行调用。

    # 1. 首先拿到了发布的静态库
    	`head.h``libcalc.a`
    	
    # 2. 将静态库, 头文件, 测试程序放到一个目录中准备进行测试
    .
    ├── head.h          # 函数声明
    ├── libcalc.a       # 函数定义(二进制格式)
    └── main.c          # 函数测试
    

    编译测试程序,得到可执行文件。

    # 3. 编译测试程序 main.c
    $ gcc main.c -o app
    /tmp/ccR7Fk49.o: In function `main':
    main.c:(.text+0x38): undefined reference to `add'
    main.c:(.text+0x58): undefined reference to `subtract'
    main.c:(.text+0x78): undefined reference to `multiply'
    main.c:(.text+0x98): undefined reference to `divide'
    collect2: error: ld returned 1 exit status
    
    1. 更正编译程序
    # 4. 编译的时候指定库信息
    	-L: 指定库所在的头目录(相对或者绝对路径)
    	-l: 指定库的名字, 掐头(lib)去尾(.a) ==> calc
    # -L -l, 参数和参数值之间可以有空格, 也可以没有  -L./ -lcalc
    $ gcc main.c -o app -L ./ -l calc
    
    # 查看目录信息, 发现可执行程序已经生成了
    $ tree
    .
    ├── app   		# 生成的可执行程序
    ├── head.h
    ├── libcalc.a
    └── main.c
    
    展开全文
  • 生成Linux静态库的工程模板,只要在Makefile 文件中添加工程中源文件头文件的路径,就可以生成Linux静态库。这里是demo工程。
  • 本文主要讲解什么是库、库的种类以及静态库和动态库的分析。
  • 下面小编就为大家带来一篇Linux下g++编译与使用静态库和动态库的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Linux静态库制作过程 以及编译
  • linux静态库和共享库.pdf
  • 库用于将相似函数打包在一个单元中然后这些单元就可为其他开发人员所共享并因此有 了模块化编程这种说法 即从模块中构建程序Linux 支持两种类型的库每一种库都 有各自的优缺点静态库包含在编译时静态绑定到一个程序...
  • Open62541 Linux静态库

    2018-08-24 13:13:27
    Linux 下编译的OPC UA Open62541 静态库文件,包括server Client
  • linux静态库和动态库制作归纳文档,详细编辑制作流程,清晰的思路。
  • linux 静态库的使用

    2015-03-12 22:41:58
    linux 静态库的使用
  • 1、Linux静态库和动态库的命名规则 静态函数库 静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中。 a)优点 编译后,可执行文件不需要外部支持; ...

    文章转自:https://www.cnblogs.com/linuxbo/p/4301724.html

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

    静态函数库

    静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中。
    a)优点
    编译后,可执行文件不需要外部支持;
    b)缺点
    生成的可执行程序大;静态库改变了,就需要重新编译可执行程序。

    动态库函数

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

    优点

    1. 实现进程的资源共享,当程序在运行的时候需要调用某个动态链接库函数时候,OS会先查看所有正在运行的程序,看内存里面是否已经有此函数的拷贝了,有责共享那个拷贝,没有才会链接载入,这样会大大节省OS的内存资源;
    2. 升级容易,升级动态链接库即可,不需要重新编译可执行程序;

    2、gcc/g++的编译链接:

    通常,对函数的链接是在编译期的时候完成的,所有相关的对象文件与相关联的library被链接成一个可执行文件,这就是使用静态库的编译过程,而动态库技术:对一些库函数的链接载入推迟到程序运行的时候。
    但是,不管是使用静态库还是使用动态库,这些库文件都是由*.o文件生成的,在给编译器gcc传不同的参数,就会生成相应的静态库或者是动态库了。

    静态库和动态库的创建过程

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

    //假如同目录下有main.cpp,test.cpp,error.cpp三个文件,执行如下
    
    //生成.o文件
    g++ -c test.cpp error.cpp
    //执行这步编译生成test.o和error.o文件
    
    //生成静态库
    ar -rt libtest.a error.o test.o
    ar cr libtest.a error.o test.o
    
    //使用静态库
    g++ main.cpp -L./ -ltest -o main.exe
    

    注意:
    -L:指定静态库的搜索路径
    -l:指定静态库/动态库名称,不需要携带前缀lib和后缀.a或.so

    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动态库文件。

    使用静态库和动态库的方法

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

    格式:gcc file1.o file2.o –Lpath –lxxx –o yourprogrammer
    举例:gcc file1.o file2.o –L./ –ltest –o test //test为可执行程序
    

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

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

    参考资料:
    https://www.cnblogs.com/linuxbo/p/4301724.html

    展开全文
  • mqtt linux静态库,动态库,以及html帮助文档。包含man手册
  • Linux 静态库转换为动态库

    千次阅读 2018-06-27 19:57:03
    是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在文件中。 下面是ar命令的格式: ar [-]{dmpqrtx}...
  • 我们在写c语言的时候,经常会去包含一个.h的头文件,这个头文件就是文件,比如<stdio.h>,<stdlib.h>这些都是标准的头文件,一般放在/usr/include,也就是说,从这个目录中我们可以找到这个头文件,然后...
  • linux 静态库的链接 undefined reference

    千次阅读 2018-04-26 00:05:02
     其根本原因也是找不到test()函数的实现文件,由于该test()函数的实现在test.a这个静态库中的,故在链接的时候需要在其后加入test.a这个库,链接命令修改为如下形式即可。 gcc -o main main.o ./test.a  //注...
  • linux静态库的几种链接方式

    千次阅读 2016-09-22 16:53:28
    按上面的方式进行链接,提示一直找不到-lipc_server,后面发现是由于生成的没有加lib前缀导致的,应该要这种格式libipc_server.a,但是另一种方式可以链接ipc_server.a这种形式的,如下: 这种方式直接指定...
  • linux 动态库静态库

    2018-04-05 15:21:40
    Ubuntu linux动态库静态库的创建与使用附工程代码....
  • linux静态库 动态库 去符号 符号恢复

    千次阅读 2018-04-17 00:45:08
    前言 最近遇到了一题去除符号的题目,需要进行符号修复。为此学习了一波,顺便补了补其它的一下知识。 准备知识 命名方式: ...动态库libxxx.so.major.minor .so .dll 静态库:libxxx.a .a ....生成静态库 ar cqs l...
  • Linux动态库和静态库

    万次阅读 多人点赞 2021-10-28 10:56:35
    文章目录动静态库的基本原理认识动静态库静态库各自的特征静态库的打包与使用打包使用动态库的打包与使用打包使用 动静态库的基本原理 动静态库的本质是可执行程序的“半成品”。 我们都知道,一堆源文件和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 193,634
精华内容 77,453
关键字:

linux静态库

友情链接: axgmbtdn.zip