• Linux库的创建和使用


    Linux库的概念

    库是一种软件组建技术,里面封装了数据和函数,提供给用户程序调用。使用库能够使程序模块化,提高编译速度,实现代码重用,易于升级。

    Windows系统提供了大量静态链接库(.lib)和动态链接库(.dll)文件。

    在Linux中,库文件放在/usr/lib或/lib文件夹下,Linux库文件名称由前缀lib,库名以及后缀三部分组成,动态库以.so作为后缀,静态库以.a作为后缀。


    静态库的特点

    静态库的代码在编译时就复制到程序中,多个程序同一时候引用一个静态库函数时,内存中将会有调用函数的多个副本。

    静态库节省编译时间,可是导致代码量膨胀。

    长处是编译后的运行程序不须要外部函数库支持。可是假设静态函数库改变了。程序须要又一次编译。
    静态库的创建和使用
    步骤:

    1. 在一个头文件里声明静态库所导出的函数。
    2. 在一个源文件里实现静态库所导出的函数。

    3. 编译源文件,生成可运行代码。
    4. 将可运行代码所在的目标文件增加到某个静态库中,并将静态库复制到系统默认存放库文件的文件夹下。(假设不拷贝则须要用命令行选项指定库文件所在文件夹)
      实例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    /* mylib.h */
    #ifndef _MYLIB_H
    #define _MYLIB_H
    void welcome();
    void print_string(const char *str);
    #endif
    /* mylib.c */
    #include "mylib.h"
    #include <stdio.h>
    void welcome()
    {
    printf("Welcome to libmylib ");
    }
    void print_string(const char *str)
    {
    if (str != NULL)
    printf("%s ", str);
    }

    编译mylib.c生成目标文件:
    gcc -o mylib.o -c mylib.c
    将目标文件增加到静态库中,静态库为libmylib.a
    ar rcs libmylib.a mylib.o
    rcs命令行是选项,含义请參考man手冊
    将静态库复制到Linux的库文件夹/usr/lib或/lib下:
    cp libmylib.a /usr/lib/libmylib.a

    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* test.c */
    #include "mylib.h"
    #include <stdio.h>
    int main(void)
    {
    welcome();
    print_string("It's successful");
    return 0;
    }

    编译而且运行:
    gcc -o test test.c -lmylib
    -l为选项,mylib是库名,省略前后缀
    ./test
    假设前面没有复制到Linux的库文件夹,须要指定静态库文件的路径
    gcc -o test test.c -L. -lmylib
    -L.表示库文件在当前路径。
    很多其它ar命令请參考man ar手冊。


    动态库的特点

    动态库在程序開始执行后调用库函数时才被加载,被调函数在内存中仅仅有一个副本,且能够在程序执行期间释放动态库所占的内存。

    眼下Linux中使用动态库居多,由于升级方便。
    动态库的创建和使用
    把mylib.c创建成动态库的命令:
    gcc -fPIC -o mylib.o -c mylib.c
    gcc -shared -o mylib.so mylib.o
    或者
    gcc -fPIC -shared -o mylib.so mylib.c
    使用动态库:
    gcc -o test test.c ./mylib.so
    ./test
    还有一种方法是通过调用系统函数使用动态链接库,详细參考
    void* dlopen(const char *filename, int flag)系列函数。


    參考

    《Linux C编程实战》,加入部分内容,改动了部分代码。

  • 相关阅读:
    今日小结 5.7
    今日小结 5.2
    今日小结 4.30
    今日小结 4.29
    设计模式 笔记1
    第一次找实习
    Java入门 任务表
    今日小结 4.24
    今日小结 4.18
    今日小结 4.17
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/6701322.html
Copyright © 2020-2023  润新知