动静态库介绍
有时候我们需要使用别人编写的代码,或者别人需要使用你编写的代码,但是你不想把自己的源代码给它,这个时候我们只需要将我们的程序打包成为动静态库,然后把头文件给他告诉里面有哪些接口,他直接调用就行了
静态库
通常以.a为文件末尾,其中.a是(archive)的缩写,中文表示归档文件,这里为静态库的意思,它的特点是程序在编译的时候就会把程序拷贝到可执行程序中,运行的时候不再依赖这个静态库,即便你把它删除掉了都没有关系,缺点是会导致程序占用控件变大
动态库
通常以.so为文件结尾,程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。因此如果程序在运行的时候如果没有这个动态库程序就运行不了
静态库的制作

静态库的使用
拷贝到系统中
这种方法需要我们将.h文件拷贝到/usr/include/目录下,将静态库拷贝到/lib64目录下

拷贝完成之后我们就可以直接使用了,但是后面我们在编译我们的程序的时候,需要在后面加上这样一句话 -l myFunc 表示需要链接这个静态库,注意这个静态库需要去掉前缀和后缀

拷贝到本地
这种方法和上一种方法没有太大的变化,只是生成可执行文件的时候有一点区别

在上面的方法中,我们需要将头文件和静态库拷贝到当前的路径下进行使用,编译的时候还需要指明让编译器去那个路径下面去找静态库
下面我们通过编写makefile文件的方式来为我们的静态库进行输出到指定的目录下面去
cpp
libmyFunc.a:helloworld.o comeon.o
2 ar -rc $@ $^
3 %.o:%.c
4 gcc -c $<
5
6 .PHONY:clean
7 clean:
8 rm -fr *.a *.o stdc
9
10 .PHONY:output
11 output:
12 mkdir -p stdc/include
13 mkdir -p stdc/lib
14 cp -f ./*.h stdc/include
15 cp -f ./*.a stdc/lib
16 tar czf stdc.tgz stdc
这样就能生成一个stdc和stdc.tgz的文件和压缩包了
打包好了之后就可以将库交给别人了,但是现在在使用上还是有一些区别,下面我们来演示一下

动态库的使用
首先我们需要生成动态库
cpp
libmyFunc.so:helloworld.o comeon.o
2 gcc -o $@ $^ -shared
3 %.o:%.c
4 gcc -fPIC -c $<
5
6 .PHONY:clean
7 clean:
8 rm -rf *.so *.o stdc*
9
10 .PHONY:output
11 output:
12 mkdir -p stdc/include
13 mkdir -p stdc/lib
14 cp -f *.h stdc/include
15 cp -f *.so stdc/lib
16 tar -czf stdc.tgz stdc
其中,上面的-shared表示要生成共享格式,-fPIC表示产生位置无关码
生成之后我们需要使用,但是使用方法和静态库是有区别的,其中第一种将文件拷贝到系统中和静态库是一样的,但是拷贝到本地还是有区别的

我们通过查看当前可执行文件的依赖文件,发现找不到动态库,这是因为程序在运行的时候系统需要在默认路径下去找动态库,但是在/lib64下根本没有这个东西,这个时候除了将将动态库拷贝到/lib64目录下,还可以建立软链接

这个时候我们就能发现能够找到动态库了
还有一种方法就是将当前的库目录添加到LD_LIBRARY_PATH中

注意如果同时提供动动态库和静态库,系统会默认使用动态库,如果想要使用静态库,需要在后面加上-static。
如果需要强制链接静态库,必须提供静态库,反之,如果链接的是动态库,但是没有动态库,系统会找静态库