• Linux下动态库和静态库的生成和使用


    1.准备头文件和源文件

    hello.h

    #ifndef HELLO_H
    #define HELLO_H
    void hello(const char *name):
    #endif

    hello.c

    #include <stdio.h>
    
    void hello(const char *name)
    {
        printf("Hello, %s!
    ", name);       
    }

    main.c

    #include "hello.h"
    
    int main(int argc, char * argv[])
    {
        hello("C Programmer");
        return 0;
    }

    2.了解动态库和静态库的区别

    ①静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。

    ②动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。

    3.静态库的生成步骤

    ①编译hello.c生成目标文件,注意此时要加入参数-fPIC;

    gcc -c -fPIC hello.c

    执行此命令后会生成hello.o的目标文件。

    ②根据上面的hello.o文件生成动态库文件;

    动态库文件名命名规范和静态库文件名命名规范类似,也是在动态库名增加前缀lib,但其文件扩展名为.so。例如:我们将创建的动态库名为myhello,则动态库文件名就是libmyhello.so。用gcc来创建动态库。

    gcc -shared -fPIC -o libmyhello.so hello.o

    执行此命令后会生成libmyhello.so的动态库文件。

    ③使用动态库;

    gcc -o hello main.c -L. -lmyhello  // 和静态库一样

    此时运行hello会报错,原来是找不到动态库文件libmyhello.so。程序在运行时,会在/usr/lib和/lib等目录中查找需要的动态库文件。若找到,则载入动态 库,否则将提示类似上述错误而终止程序运行。我们将文件 libmyhello.so复制到目录/usr/lib中,再试试。结果成功了!这也进一步说明了动态库在程序运行时是需要的。

    4.动态库的生成步骤

    ①编译hello.c生成目标文件;

    gcc -c hello.c

    执行此命令后会生成hello.o的目标文件。

    ②根据上面的hello.o文件生成静态库文件;

    静态库文件名的命名规范是以lib为前缀,紧接着跟静态库名,扩展名为.a。例如:我们将创建的静态库名为myhello,则静态库文件名就是libmyhello.a。

    ar cr libmyhello.a hello.o

    执行此命令后会生成libmyhello.a的静态库文件。

    ③使用静态库;

    gcc -o hello main.c -L. -lmyhello

    上面如果不指定静态库的话,由于main.c中引入了hello.h,编译则会报错。

    执行上面的命令,生成的hello可执行文件便可以运行了,libmyhello.a文件删除后也不会影响hello的运行。

    5.PS

    当静态库和动态库同名时, gcc命令将优先使用动态库。

  • 相关阅读:
    [BZOJ1006]神奇的国度
    配置ubuntu18.04
    数据库的基本操作
    关于排序的算法——桶排序
    关于TCP/IP协议的记录
    laravel学习历程
    装箱问题
    01背包
    数字三角形
    统计单词的个数
  • 原文地址:https://www.cnblogs.com/shizqiang/p/5522636.html
Copyright © 2020-2023  润新知