• Linux 下的静态(函数)库、动态(函数)库


    0. 基本

    • 在命名上,静态库的名字一般是 libxxx.a,动态库的名字一般是 libxxx.so,有时 libxxx.so.major.minor,xxx 是该 lib 的名字,major 是主版本号,minor是副版本号。
    • linux 系统存放函数库的目录:/lib(/lib64),/usr/lib(/usr/lib64)

      lrwxrwxrwx.   1 root root    7 Sep  2 22:24 lib -> usr/lib
      lrwxrwxrwx.   1 root root    9 Sep  2 22:24 lib64 -> usr/lib64

    1. 判断一个程序有没有链接程序库

    • file:查看文件类型;
    • ldd:将所有依赖的动态函数库取出来查阅;
    $ ldd $(which sshd)
            # which sshd ⇒ /usr/bin/sshd
    $ ldd $(which sshd rsyslogd xinetd httpd)

    2. 静态库与动态库的编译

    • 静态库:

      • 1、生成目标文件:
      $ gcc -Wall -c file1.c file2.c file3.c
          # 不用指定生成.o文件名(默认生成file1.o, file2.o, file3.o)。
      • 2、从.o目标文件创建静态连接库:
      $ ar rv libNAME.a file1.o file2.o file3.o

      r : 将flie1.o, file2,o, file3.o插入archive,如故原先archive中已经存在某文件,则先将该文件删除。
      v : 显示ar操作的附加信息

    • 动态库:

      • 1、生成目标文件
      $ gcc -Wall -c -fpic file1.c file2.c file3.c
          # 可选参数
              # -g:生成调试信息,供 gdb 使用
              # -o0:指定编译优化级别

      fpic: 指定生成的.o目标文件可被重定址. pic是position idependent code的缩写: 位置无关代码.

      • 2、生成动态库文件
      $ gcc -shared -o libNAME.so file1.o file2.o file3.o

      一般地, 连接器使用main()函数作为程序入口. 但在动态共享库中没有这样的入口. 所以就要指定-shared选项来避免编译器显示出错信息.

      • 3、上述两条命令可以合并为:
      $ gcc -Wall -shared -fpic -o libNAME so file1.c file2.c file3.c

    references

  • 相关阅读:
    【Foreign】无聊的计算姬 [Lucas][BSGS]
    【Foreign】远行 [LCT]
    Leetcode题解(十)
    Leetcode题解(九)
    Leetcode题解(八)
    Leetcode题解(七)
    Leetcode题解(六)
    Leetcode题解(五)
    Leetcode题解(四)
    Leetcode题解(三)
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9421179.html
Copyright © 2020-2023  润新知