库:稳定的、可以复用的代码,以模块的形式进行组织
库的分类:
动态库
静态库
动态跟静态的区别
静态库在程序执行后,就加载到内存
程序执行后,当需要调用动态库i的函数时,才加载到内存
linux库命名规范:
liblinklist.so:
"lib[your_library_name].so":lib为前缀,中间是静态库名,扩展名为.so。
编译动态库
gcc -shared -fPIC linklist.c -o liblinklist.so
-fPIC: 编译为位置独立的代码,也就是绝对地址寻址无关
-shared: 告诉编译器,我要编译动态库
链接动态库
gcc -shared -fPIC linklist2.c -o libll.so
gcc -lll snack.c -lncurses -L. // 错误,必须.c文件写前面
gcc snack.c -lll -lncurses -L. //正确
引用动态库: -l库名 【your_library_name】
-lpthread
指定动态库的位置: -L 路径
-L /usr/lib
执行的时候,找不到动态库,手动指定动态库的位置
这个环境变量指示动态连接器可以装载动态库的路径
export LD_LIBRARY_PATH=`pwd`
查看可执行文件依赖哪些动态库
ldd 可执行文件
编译静态库
汇编生成目标文件
gcc -c add.c -o add.o
将生成的.o文件生成静态库.a
ar crf libadd.a add.o
链接静态库
gcc main.c libadd.a
预处理,编译,汇编,链接
汇编:gcc –c是使用GNU汇编器将源文件转化为目标代码