分文件编程的好处
- 功能责任划分:按功能进行分文件编写
- 方便调试:对应问题快速找到对应文件进行修改
- 主程序简洁:避免全部代码都在一个文件编写
头文件引用('< >'箭号、’ “ ” ‘引号)
- 箭号:到/usr/include/路径下查找
- 引号:到当前目录查找文件,如果没有再到/usr/include/路径下查找
库相关概念以及动态库、静态库制作 使用
“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用
- 使用库的好处
- 程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级
- 隐藏代码的同时可以提供给别人使用(“程序员的隐私”)
静态库
静态函数库:程序执行之前(编译的时候)就加入到目标程序中去了
-
优点
- 静态库被打包到应用程序中加载速度块。
- 发布程序无需提供静态库,因为已经在APP中,移植方便
-
缺点
- 链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝
- 更新、部署、发布麻烦
-
制作静态库(需要制作成库的一般都是功能文件)
两步:
- gcc 功能文件.c -c ----------->生成:.o文件
- 使用生成的.o文件制作成静态库
- ar rcs 静态库名字.a xxx.o
- 虽然静态库名字可以随意取但是规范化最好以lib开头作为标识
- ar rcs 静态库名字.a xxx.o
- gcc 功能文件.c -c ----------->生成:.o文件
-
举例使用静态库
- demo.c
- demo.h
- main.c
- 将demo.c制作成静态库
- gcc demo.c -c
- ar rcs libdemo.a demo.o
- 编译的时候只需要main.c和demo.h就可以
- gcc main.c -ldemo -L./ -o main
- -l:指定要用的静态库(连接静态库的时候如果库的名称以lib开头lib可以忽略,俗称"砍头去尾(.a也去掉)")
- -L./:-L是指定静态的路径(默认是从/usr/lib或是/lib去找)
- gcc main.c -ldemo -L./ -o main
- demo.c
动态库
动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库,文件后缀是.dll)
动态函数库:程序执行时动态地被目标程序调用
-
优点
- 链接时不复制,程序运行时由系统动态加载到内存,提供程序调用,系统只加载一次,多个程序可以公用,节省内存
- 程序升级简单,因为APP里面没有库的源代码,升级之后只要库的名字不变,函数
-
缺点
- 加载速度比静态库慢
- 发布程序需要提供依赖的动态库
-
制作动态库
将源.c文件生成.o文件,需要加一个参数fpic
- gcc xxx.c -c -fpic
制作成动态库
- gcc -shared a.o b.o libdemo.so(可以使用多个.o文件打包成动态库)
两步可以结合一起实现
-
gcc -shared -fpic 功能文件.c -o 生成库的名称.so
-
-shared:指定生成动态库
-
-fpic:标准,fpic选项用于编译阶段,在生成目标文件时就得使用该旋转,以生成位置无关码。
-
-
-
动态库使用
-
编译:gcc main.c -ldemo -L./
-
-l:指定使用的动态库
-
-L:-L是指定静态的路径(默认是从/usr/lib或是/lib去找)
-
-
-
运行
-
出错
-
这就体现了静态库的动态库的区别:静态库在编译的时候就将库的代码编译进主要程序里面了,而动态库编译的时候指定动态库是为了程序运行起来后能去找到相应的动态库
- 使用动态库:在主要程序运行起来后会到/usr/lib路径或是/lib去找
- 将动态库拷贝到/usr/lib/路径或是/lib/下再运行就可以了
- 使用动态库:在主要程序运行起来后会到/usr/lib路径或是/lib去找
-
指定动态库的查找路径
-
使用环境变量指定(这种方法是临时的,换一个终端就不行了):export LD_LIBRARY_PATH=“指定路径”
-
制作shell脚本
-
vi demo.sh
小错误:demo后面少了个引号
- 修改shell脚本的权限:chmod +x demo.sh
-
启动shell脚本
- 配置ld.so.conf文件
- sudo vi /etc/ld.so.conf
- 将动态库指定路径加进去
- sudo ldconfig(把路径加到ld.so.conf文件中要执行一次ldconfig指令,新路径才生效)
- 当 ldconfig 操作结束时,您会有一个最新的 /etc/ld.so.cache 文件,它反映您对 /etc/ld.so.conf 所做的更改。从这一刻起,动态装入器在寻找共享库时会查看您在 /etc/ld.so.conf 中指定的所有新目录。
-
-
-
-