1、分文件编程 一个项目需要实现很多模块功能,如果把这些模块代码都塞进main函数里,会显得程序臃肿,不美观。针对这一现象,可引入分文件编程。 例子:简单算法
#include <stdio.h>
int jiafa(int a, int b)
{
return a+b;
}
int jianfa(int a, int b)
{
return a-b;
}
int chengfa(int a, int b)
{
return a*b;
}
float div1(int a, int b)
{
return (float)a/b;
}
int jiafa(int a, int b);
int jianfa(int a, int b);
int chengfa(int a, int b);
float div1(int a, int b);
#include <stdio.h>
#include <stdlib.h>
#include "suanfa.h"
int main()
{
int a;
int b;
printf("input your first nu:\n");
scanf("%d", &a);
printf("input your second nu\n");
scanf("%d", &b);
printf("xiangjiawei:%d\n", jiafa(a, b));
printf("xiangjianwei:%d\n", jianfa(a, b));
printf("xiangchengwei:%d\n", chengfa(a, b));
printf("xiangchuwei:%f\n", div1(a, b));
return 0;
}
运行结果
ltk@ubuntu:~/07.09$ gcc demo1.c suanfa.c
ltk@ubuntu:~/07.09$ ./a.out
input your first nu:
1
input your second nu:
3
xiangjiawei:4
xiangjianwei:-2
xiangchengwei:3
xiangchuwei:0.333333
2、Linux共享库、静态库、动态库 一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级。 程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries): 静态函数库,是在程序执行前就加入到目标程序中去了 ; 优点: 1.静态库被打包到应用程序中加载速度快 2.发布程序无需提供静态库,因为已经在app中,移植方便 缺点: 1.链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。 2.更新、部署、发布麻烦。 动态函数库同共享函数库是一个东西 在程序执行时(临时)由目标程序去调用 优点: 1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。 2.程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。 缺点: 加载速度比静态库慢 发布程序需要提供依赖的动态库
(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll) Linux中命名系统中共享库的规则: 静态库的制作 1.将suanfa.c文件生成.o,gcc suanfa.c -c 生成了suanfa.o文件 2.将.o 打包 ar rcs 静态库的名字 原材料 ar rcs libsuanfa.a suanfa.o 生成了libsuanfa.a静态库文件 库的使用 gcc demo1.c -Isuanfa -L ./ -o mainProStatic -l(小写):指定库的名字(去掉lib和.a) -L(大写): 指定库的路径,默认是从/usr/lib 或者/usr/local/lib -o:指定生成的最终应用程序的名字 mainProStatic 生成的程序文件
ltk@ubuntu:~/07.09$ ls
demo1.c suanfa.c suanfa.h
ltk@ubuntu:~/07.09$ gcc suanfa.c -c
ltk@ubuntu:~/07.09$ ls
demo1.c suanfa.c suanfa.h suanfa.o
ltk@ubuntu:~/07.09$ ar rcs libsuanfa.a suanfa.o
ltk@ubuntu:~/07.09$ ls
demo1.c libsuanfa.a suanfa.c suanfa.h suanfa.o
ltk@ubuntu:~/07.09$ gcc demo1.c -lsuanfa -L ./ -o mainProStatic
ltk@ubuntu:~/07.09$ ls
demo1.c libsuanfa.a mainProStatic suanfa.c suanfa.h suanfa.o
ltk@ubuntu:~/07.09$ ./mainProStatic
input your first nu:
1
input your second nu
4
xiangjiawei:5
xiangjianwei:-3
xiangchengwei:4
xiangchuwei:0.250000
动态库的制作
(1)命名规则 动态库的命名方式与静态库类似,前缀相同,为“lib”,后缀变为“.so”。所以为“libname.so” (2)制作步骤 gcc -shared -fpic suanfa.c -o libsuanfa.so shared 指定生成动态库 fpic 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码
把制作好的库放到目录lib中,不放也行,其实只要有这个库就行,在这里,移到上层目录中的lib中
动态库的使用 gcc demo1.c -Isuanfa -L ./ -o mainProDy 此时会提示No such file or directory,需要进行环境变量的设置 动态库无法加载,是因为路径默认是/usr/lib寻找动态库, LINUX动态库(.SO)搜索路径(目录)设置方法 方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径。 vi /etc/ld.so.conf 添加 lib目录 ldconfig 方法二(常用):通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。 export LD_LIBRARY_PATH=”/home/ltk/07.09” ”/home/ltk/07.09” 为动态库路径 但是这是临时的,针对一个固定的窗口编译,可以编写一个脚本文件start.sh
export LD_LIBRARY_PATH="/home/ltk/07.09"
./mainProDy
给脚本加可执行权限 chmod +x start.sh 运行./start.sh
ltk@ubuntu:~/07.09$ ls
demo1.c suanfa.c suanfa.h
ltk@ubuntu:~/07.09$ gcc -shared -fpic suanfa.c -o libsuanfa.so
ltk@ubuntu:~/07.09$ ls
demo1.c libsuanfa.so suanfa.c suanfa.h
ltk@ubuntu:~/07.09$ gcc demo1.c -lsuanfa -L ./ -o mainProDy
ltk@ubuntu:~/07.09$ ls
demo1.c libsuanfa.so mainProDy suanfa.c suanfa.h
ltk@ubuntu:~/07.09$ ./mainProDy
./mainProDy: error while loading shared libraries: libsuanfa.so: cannot open shared object file: No such file or directory
通过环境变量LD_LIBRARY_PATH指定动态库搜索路径。 编写脚本文件start.sh
export LD_LIBRARY_PATH="/home/ltk/07.09"
./mainProDy
ltk@ubuntu:~/07.09$ vi start.sh
ltk@ubuntu:~/07.09$ chmod +x start.sh
ltk@ubuntu:~/07.09$ ./start.sh
input your first nu:
1
input your second nu
2
xiangjiawei:3
xiangjianwei:-1
xiangchengwei:2
xiangchuwei:0.500000
参考资料:https://www.baidu.com/link?url=ekXV3RxdlZFpsUUl4a6JyCcAiAcvpmwgWedoJvlJ3aBsuV4GA2so5Ui1ueJIB34e8o-QUl7kTiuOxyqcwls-_a&wd=&eqid=90892e1f000282c40000000560e7fa19 https://www.cnblogs.com/sunsky303/p/7731911.html
|