静态库
在与文件链接形成可执行文件后,会绑定在一起,所以优点也就是在执行的时候不需要加载,可以直接运行,缺点相同的就是重复的占用会导致内存开销过大
静态库在linux以.a结尾,在windows中以.lib结尾。
静态库的制作:
首先需要把file.c编译成file.o:gcc -c file.c -o file.o
然后把.o文件生成静态库:
1 | ar -rs file.a file.o |
生成静态库之后我们需要把main.c与静态库链接起来生成可执行文件:gcc -I<头文件路径> -L<库的路径> main.c -l<静态库的名字> -o <可执行文件名>
gcc 编译器默认搜索头文件与库文件的路径
/usr/include 为头文件默认路径
/usr/lib 与 /lib 为库的默认路径.
假如你已经把头文件,库拷到了默认路径那么就不需要加上上两个参数。
动态库
与静态库相比显然有着不同的特性,动态库加载速度偏慢,但在一般情况对内存的占用要比静态库更少。
在windows中以.dll文件结尾,十分常见,在linux中以.so文件结尾.
当可执行文件调用动态库中的函数时,则需要加载动态库到内存中
动态库的制作:
gcc -c file.c -o file.o
然后生成动态库gcc -shared file.o -o file.so
链接的命令则和静态库的一样,然后我们如果只这样执行可执行文件是会报错的:
error while loading shared libraries: libadd.so: cannot open shared object file: No such file or directory
这是因为我们没有将动态库加载到内存中,默认动态库的位置是/usr/lib,如果我们的动态库在当下目录,我们可以export LD_LIBRARY_PATH=.