1.静态库:将程序运行所需要的库文件,在程序编译的时候,一起编译进去,这样程序运行的时候,就不需要环境中有特定的库文件才能正常运行了,但是相对来说,由于把库文件添加进去一起编译了,所以生成的可执行文件的内存就比较大。
缺点:1.占用的空间大,造成空间的浪费。
2.如果程序需要修改某一部分,就要重新对整个文件进行编译,链接。
优点:程序移植方便,不需要考虑环境下是否有相应的库文件。
比如设计数学运算工具模块 mathmodel.h, mathmodel.c main.c 用到了数学运行函数 gcc -o main main.c mathmodel.c gcc -o mathmodel.o -c mathmodel.c --第一步 gcc -o main main.c mathmodel.o --可把mathmodel.o装入库中(静态库, 动态库)
静态库的制作步骤:
把mathmodel.c 制作静态库 1.把源文件编译成.o文件 (二进制文件) gcc -o mathmodel.o -c mathmodel.c 2. 用归档工具ar归档为一个库文件 (lib库名.a) ar crv libmathmodel.a mathmodel.o 3. 使用静态库编译程序 gcc -o main main.c -L. -lmathmodel -L. --后面添加库所在的路径(自动搜索的库路径) -lmathmodel ---指定链接哪一个库(-l库名) 如果是在当前路径下面,则是(L.)
2.动态库:编译的时候不需要将所需的库文件一起编译进去,但是在程序运行的时候,当前环境下需要有这些库文件才能运行,编译生成的可执行文件就不会那么大。
优点:1.程序升级方便。
2.代码和数据共享。
3.可以选择性的加载部分模块。
4.节省空间和资源
动态库制作:
1. 编写源文件 mathmodel.c 2. 把源文件编译成二进制文件 mathmodel.o gcc -fPIC -o mathmodel.o -c mathmodel.c 3. 把.o文件打包成库 gcc -fPIC -shared -o libmathmodel.so mathmodel.o 4. 用动态库编译程序 gcc -o main main.c -L. -lmathmodel 5. 运行程序 gec@ubuntu:/mnt/hgfs/05/code/shared$ ./main
可能会出现的问题:
./main: error while loading shared libraries: libmathmodel.so: cannot open shared object file: No such file or directory
解决问题--添加库环境变量(告诉系统到哪个目录下找这个库)
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD
3.makefile文件在linux环境下的编程中简直是一个神器,它能使你每次编译文件的时候不再需要敲那些巨长的编译命令,更改了几行之后重新编译,又要重新敲一次命令,或者不停地按着“上下”键找命令,makefile文件他能够帮助你只要输入一下“make”命令之后,就会自动编译了,不再需要敲巨长的命令了。不同的编译命令对应的makefile内容不同。
TARGET=main
SRCS=$(wildcard *.c ./*/*.c)
OBJS=$(patsubst %.c,%.o,$(SRCS) )
CC=gcc
$(TARGET):$(OBJS)
$(CC) -o $@ $^
%.o:%.c
$(CC) -c $< -o $@ £»
.PHONY:clean echo
echo:
@echo "source files: $(SRCS)"
@echo "object files: $(OBJS)"
clean:
-rm $(OBJS) $(TARGET)
常用makefile命令:
编译:make
删除编译生成文件:make clean
PS:如果有哪里写错了,请指正,大家互相学习一下。