Linux下静态库、动态库的创建与调用

简介: 在项目开发时,经常会用到第三方库,也会自己创建动态库给别人或者给自己其他的工程项目使用。这篇文章介绍Linux下静态库、动态库的创建与调用。

一、前言

在项目开发时,经常会用到第三方库,也会自己创建动态库给别人或者给自己其他的工程项目使用。

  1. 库的类型分为动态库静态库
  2. 在Linux下动态库的后缀为.so,静态库的后缀为.lib
  3. 动态库称为共享库. 程序在编译的时需要、运行的时候也需。
  4. 静态库在编译的时候抽取需要使用的函数进行编译、运行的时候不需要库。
  5. 静态编译的程序比动态库链接占用空间更加大。

二、动态库的创建与使用案例

2.1 创建动态库

创建动态库的语法格式:
gcc -fPIC -shared -o <库文件名称>.so 源文件名称.c

<库文件名称>如何命名?    libxxx.so   更改的地方xxx
源文件名称.c  可以是多个.

例如:
[wbyq@wbyq sum]$ ls
sum.c  sum.h
[wbyq@wbyq sum]$ gcc -fPIC -shared -o libsum.so sum.c 
[wbyq@wbyq sum]$ ls
libsum.so  sum.c  sum.h

2.2 gcc编译时常用的语法选项

gcc <源文件> [选项参数]
常用的选项参数介绍:
-o <outfile>  指定编译之后生成的可执行文件名称
-c 表示生成.o文件
-I <path>  指定编译时搜索头文件的路径。可以指定多个头文件路径。
例如: gcc 123.c -I/work -I/home ...
-L <path> 指定编译时搜索库文件的路径。可以指定多个库文件路径。
例如: gcc 123.c -L/wor/lib -L/home/lib ...
-l <name> 指定编译时使用的库文件名称. 可以指定对个库文件名称. 
         如果我们使用的库文件名称是 libabc.so libsum.so 
      用法例如: gcc 123.c -labc -lsum

2.3 编译时如何指定库文件和头文件?

[wbyq@wbyq linux_c]$ ls
a.out  app  app.c  app.o  sum
[wbyq@wbyq linux_c]$ 
[wbyq@wbyq linux_c]$ gcc app.c 
app.c:3:17: 错误:sum.h:没有那个文件或目录
[wbyq@wbyq linux_c]$ gcc app.c -I sum/
/tmp/ccCNE8sV.o: In function `main':
app.c:(.text+0x5a): undefined reference to `sum_val'
collect2: ld 返回 1
[wbyq@wbyq linux_c]$ gcc app.c -I sum/ -L sum/
/tmp/cccXsHyA.o: In function `main':
app.c:(.text+0x5a): undefined reference to `sum_val'
collect2: ld 返回 1
[wbyq@wbyq linux_c]$ gcc app.c -I sum/ -L sum/ -lsum

2.4 如何解决运行时找不到动态库的问题?

说明: 默认情况下系统搜索动态库的路径是/lib 、 /usr/lib

方法1: 直接将动态库拷贝到/lib 或者 /usr/lib 目录下。

[wbyq@wbyq linux_c]$ ./a.out 
./a.out: error while loading shared libraries: libsum.so: cannot open shared object file: No such file or directory
[wbyq@wbyq linux_c]$ sudo cp sum/libsum.so /lib/
[sudo] password for wbyq: 
[wbyq@wbyq linux_c]$ ./a.out 
./a.out <int> <int>
[wbyq@wbyq linux_c]$ ./a.out 123 456
c=579
[wbyq@wbyq linux_c]$ 

方式2: 设置环境变量

[wbyq@wbyq sum]$ ls
libsum.so  sum.c  sum.h
[wbyq@wbyq sum]$ pwd
/mnt/hgfs/linux-share-dir/linux_c/sum
[wbyq@wbyq sum]$ cd ..
[wbyq@wbyq linux_c]$ ls
a.out  app  app.c  app.o  sum
[wbyq@wbyq linux_c]$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/hgfs/linux-share-dir/linux_c/sum
[wbyq@wbyq linux_c]$ ./a.out 
./a.out <int> <int>

三、静态库创建与使用

3.1 创建静态库

注意: 动态库如果静态库名字重名的时候,编译器优先使用动态库.

静态库的命名规则: libxxx.a

创建静态库的流程:

  1. 先将.c源文件编译成.o文件
gcc xxx.c xxx.c xxx.c ... -c
例如: gcc sum.c -c 
  1. 在将.o文件打包成静态库文件.
ar crv libxxx.a xxx.o xxx.o ....
例如:  ar crv libmylib.a my_print.o my_math.o

3.2 如何使用静态库

[wbyq@wbyq linux_c]$ cd sum/
[wbyq@wbyq sum]$ ls
sum.c  sum.h
[wbyq@wbyq sum]$ gcc sum.c -c
[wbyq@wbyq sum]$ ar crv libsum.a sum.o 
a - sum.o
[wbyq@wbyq sum]$ ls
libsum.a  sum.c  sum.h  sum.o
[wbyq@wbyq sum]$ cd ..
[wbyq@wbyq linux_c]$ ls
app.c  sum
[wbyq@wbyq linux_c]$ gcc app.c -I sum/ -L sum/ -lsum
[wbyq@wbyq linux_c]$ ./a.out 
./a.out <int> <int>
目录
相关文章
|
1天前
|
Linux vr&ar C语言
|
2天前
|
存储 Linux 编译器
【Linux】详解动态库链接和加载&&对可执行程序底层的理解
【Linux】详解动态库链接和加载&&对可执行程序底层的理解
|
2天前
|
Ubuntu Linux 编译器
【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤
【Linux】详解动静态库的制作和使用&&动静态库在系统中的配置步骤
|
5天前
|
JSON Java Linux
【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )
【探索Linux】P.30(序列化和反序列化 | JSON序列化库 [ C++ ] )
20 2
|
5天前
|
存储 Linux 编译器
【探索Linux】P.13(文件系统 | 软硬链接 | 动态库和静态库)
【探索Linux】P.13(文件系统 | 软硬链接 | 动态库和静态库)
12 0
|
5天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
23 5
|
6天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
15 3
|
7天前
|
安全 Linux Android开发
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
该文介绍了如何在Linux服务器上交叉编译Android的FFmpeg库以支持HTTPS视频播放。首先,从GitHub下载openssl源码,解压后通过编译脚本`build_openssl.sh`生成64位静态库。接着,更新环境变量加载openssl,并编辑FFmpeg配置脚本`config_ffmpeg_openssl.sh`启用openssl支持。然后,编译安装FFmpeg。最后,将编译好的库文件导入App工程的相应目录,修改视频链接为HTTPS,App即可播放HTTPS在线视频。
FFmpeg开发笔记(十六)Linux交叉编译Android的OpenSSL库
|
14天前
|
存储 Linux 编译器
Linux静态库与动态库的使用
Linux静态库与动态库的使用
|
17天前
|
Linux 编译器 vr&ar
【库函数】Linux下动态库.so和静态库.a的生成和使用
【库函数】Linux下动态库.so和静态库.a的生成和使用
11 1