怎么生成并使用动态库和静态库
为什么要有库呢?因为当你想要把你的代码给别人用时,但是又不想把你的源代码给别人时,这个时候你就可以把自己的代码封装成库,然后给别人提供库就可以了,这样别人看不到你的源代码但是可以根据你的库来使用你的方法。
一般想要用库得要有两个东西,一个是对应的库文件,一个是与库文件对应的头文件。
库分为两种:分别是静态库和动态库。
静态库(.a):程序在编译链接的时候把库的代码连接到可执行文件中。程序运行的时候不在需要静态库。
动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用。
举个栗子:假如我们写了一套加减法运算的代码,此时我要把这个方法给别人用,那么如果要封装静态库,然后使用它该怎么做呢?
如何生成并使用静态库
- 用gcc -c生成目标文件,把所有的 .c 文件都生成 .o 文件

- 使用ar -rc命令打包静态库,用所有的 .o 文件打包生成libmymath.a的静态库(注意:lib是该静态库的前缀,.a 是该静态库的后缀,mymath是我设置的这个静态库的名字(可以自己设置),这些必不可少)

- 把我们设置的库文件以及头文件进行规整

- 我们怎么使用这个静态库呢?
引入头文件

编译过程
编译一共有四个选项
第一个:-I(大写的i),这个选项后面跟的路径是需要使用库的头文件的位置(也就是找.h)
第二个:-L,这个选项后面跟的路径是需要使用库的位置(也就是找.a)
第三个:-l(小写的L),这个选项是告诉编译器我们的库的名称(也就是指定我们使用哪一个静态库,指定的时候要去掉前缀lib和后缀.a)
第四个:-static,这个选项就是需要使用静态库编译时必加的选项(注意,如果不加-static,用gcc编译的时候默认使用的都是动态链接,所以如果不加-static时,使用的是 libc.so(标准c库))
(崩溃辽,为甚么这个大写i和小写L打出来长得这么像啊啊啊!(。・`ω´・),大家看的时候小心点!٩(๑>◡<๑)۶ )

如何生成并使用动态库
- 生成目标文件,使用gcc -c *.c -fPIC把所有的.c文件生成与位置无关码的.o文件

- 打包动态库,使用gcc -shared -o libmymath.so *.o 将所有的.o文件打包成动态库(注意:lib是该动态库的前缀,.so 是该动态库的后缀,mymath是我设置的这个动态库的名字(可以自己设置),这些必不可少)

- 把这个动态库也进行规整

- 设置环境变量
编译是编译(编译器干的事情),运行是运行(操作系统干的事情),所以我们要提前设置好我们的环境变量,设置该环境变量是为了让操作系统在运行我们的代码时,去这里的路径寻找,否则编译器会默认使用 libc.so。

- 编译过程
编译一共有三个选项(和使用静态库的前三个一样(。・ω・。))
第一个:-I(大写的i),这个选项后面跟的路径是需要使用库的头文件的位置(也就是找.h)
第二个:-L,这个选项后面跟的路径是需要使用库的位置(也就是找 .so)
第三个:-l(小写的L),这个选项是告诉编译器我们的库的名称(也就是指定我们使用哪一个动态库,指定的时候要去掉前缀lib和后缀 .so)

本文详细介绍了如何生成和使用静态库(.a)与动态库(.so),包括库的概念、生成步骤及编译链接时的参数设置,适用于希望封装代码供他人使用但不公开源码的开发者。

1148

被折叠的 条评论
为什么被折叠?



