makefile 与 库的使用
库:
库:库就是把平时用的或者一个项目中所用的重复的代码集中放在一个目录下,一般是做成静态库或者动态库的形式放在一个地方,每次需要使用的时候链接以下就可以了。库放置的地方和形式下面将会分开说。
静态库:
如果程序时在编译时加载库的文件的就使用静态库。也就是说使用静态库的时候,静态库代码在编译时就拷贝到了程序的代码段,相对的程序的体积就会膨胀。静态库的原则是:“以时间换空间”增加了程序的体积,同时减少了运行的时间。
静态库的创建:
首先,系统库一般就在/usr/bin64/目录下,这里一般都是系统标准的库。
1。首先将包含目标函数的的文件使用-c 编译成.o文件
2. 使用ar -rc 命令生成 . a 文件,ar -rc xxx.a xxx.o
3. 命名规则为: lib + name
4. 这时静态库文件已经完成就是 lib+name.a 的这个文件,接下来就可以使用了。
5. 然后可以使用这样编译 : gcc -o xxx xxx.c -lname
动态库:
在运行时加载目标代码就成为了动态代码,使用动态库,则程序中只保留文件的名字和函数名,在运行时查找使用,这是库的文件是在内存中的,动态库一般都在开机时加载都内存中,一直存在随时链接使用。动态库则是以时间换空间,增加了运行的时间,但是减少了程序本身的大小。
动态库的使用有三种方法:
1.首先使用gcc -fpic 制作出libname.so文件,这里.so 文件就是动态库的文件。
2.将其绝对路径写入/etc/ld.so.conf 中,执行ldconfig 就可以使用了,这种方法长期有效,同时你也可以将这个库文件写入到/bin64 文件中,这样每次开机时自动加载,但是不建议这样做,系统的标准库一般不要随意的修改。
3.如果你是临时使用一次那么就,执行/sbin/ldconfig +绝对路径,那么在关机之前,都是可以使用的。
最后编译即可。
strip 可以 删除可执行文件的符号表,导致不可反汇编。
动态库与静态库的区别:
1,静态库类似于一个压缩包,编译器可以解开这个包。动态库则是一个可执行的二进制文件
2,静态库链接使用的时候会发生复制动作,但是动态库只有一份,动态库需要使用源码编译,需要放在内存中使用。
3,静态库被更改,所有都要重新链接,动态库可以直接更改
4,动态库可以跨平台,但是静态库不行。
makefile:
makefile 一般在编译大型项目时使用,类似于一门语言,是一项技能。
使用它有两种方式,1,自己定义编译规则
2,使用它的自动推导规则的方式
最简单的规则:
首先有一个名字为T.c的文件
T:T.o
这相当于使用了自动推导规则。
还有一种写法:
TGT = $(shell pwd)/T
OBJ = $(shell pwd)
$(TGT):
$(CC) -o $(TGT) $(OBJ)/*.c
clean:
rm -rf *.o
这里就使用了,较为复杂方式,开始定义了两个路径,第一个是源文件所在的路径,OBJ 是目标文件的路径,$(TGT),这是make的第一步,其实整个makefile都是顺次执行的,除非用参数指定一般都是默认执行第一步编译条件,然后,clean 执行的是一个删除命令,删除.o 文件。