1:如何制作库。库的制作视角2:如何使用库 库的使用者角度3:库的制作和加载原理 —ELF库是提前写好的diamanté和数据的集合可以被我们自己的程序直接进行链接使用linux 动态库.so 静态库 .awindows 动态库 .dll 静态库 .lib库本质是二进制文件 文件内容属性 磁盘为什么要存在库提高开发者效率 增加代码健壮性 鲁棒性linux中库名 libXXX.so/.asrc(shellls∗.c)这种写法等价于src(shell ls *.c)这种写法等价于 src(shellls∗.c)这种写法等价于src(wildcard.c)linux中 .h头文件一般放在/usr/include/ 这个目录中 或者是存放在当前路径中gcc -E main.c -o main.igcc -S main.i -o main.sgcc -C main.s -o main.ogcc main.c -o maingcc -o main main.o hello.ogcc -o myexe main.o -L myc/lib -lmycgcc main.c -I myc/include -L myc/lib -lmyc -o main.exelinux库名称 lib库名.a/.so .a是静态库 .so是动态库-I代表.h文件所在的路径 -L 库所在的路径 -l库名称把库安装到系统中的方法把库安装到 /lib64把头文件安装到/usr/includesudo cp myc/include// /usr/include/sudo cp myc/lib/* /lib64 -rf这个时候 gcc main.c -lmyc 虽然此时库文件已经在这个lib64系统文件夹中但是由于是第三方库所以需要加上-lmycsudo rm usr/include/my_str*库-能不能出现main函数不可以库编译到.o就可以了就不会在链接了链接需要有main函数mv makefile makefile_backup库的制作和使用的过程中使用动态库是最佳实践cp makefile_back makefile复制makefile_back 这个文件到当前目录之下生成一个叫makefile的文件这个图片是原来makefile的图片gcc默认就能生成动态库库是多个.o文件加工而来的静态库的加工方式 ar-rc 例如ar-rc 目标库的名称(.a) 原材料名称动态库的加工方式 gcc -shared -o 目标文件名称.so原材料名称gcc -o myexe main.c -I myc/include -L myc/lib -lmyc.i是预处理文件.s是汇编文件.o目标文件除了运行程序之外需要完整路径 其他linux指令操作要是这个文件在当前路径就可以直接写这个文件的名称./myexe 这个操作和编译器就没有关系了os加载运行的动态链接的可执行程序除了要运行你自己的程序之外还需要加载动态库如何让os找到你的动态库在程序运行的时候。如何让os查找到库的路径1: /usr/lib64动态链接的库也在这个路径之下操作系统会进行查找linux指令ldd myexe专门查看动态链接程序 / 动态库依赖哪些 .so 动态共享库用于排查「找不到 so」运行报错。./exe2:在系统路径之下建立软链接sudo ln -s /home/whb/code/code/118/code/lesson/user/myc/lib/libmyc.so /lib64/libmyc.so3:环境变量LD_LIBRARY_PATH:有可能不存在 保存linux系统搜索路径export LD_LIBRARY_PATHLD_LIBRARY_PATH:/home/whb/code/code/118/lib/这个时候就给了操作系统第二次选择机会就是去环境变量里面寻找动态库的地址但是当我们再次登入这个xshell时候会重新读区配置文件重新设置环境变量临时的怎么把它变成永久化设置到对应的配置文件中家目录配置文件中.bash_profile .bashrcvim ~/.bash_profile~代表家目录 /rootexport PATH/home/whb/code/code/118/bin:$PATHexport的作用是把他标记为环境变量静态链接.a 静态库编译时把库的全部机器代码复制、打包进最终可执行程序里运行时不再依赖原库文件。动态链接.so 动态库编译只记录库名、函数符号不复制代码程序运行时系统才去磁盘加载 .so 文件。1.头文件分离问题2.如果同时存在动静态库呢如果同时存在动静态库优先进行动态链接要是一定要静态链接 gcc -o myexe main.c -L myc/lib -lmyc -static:建议编译器优先使用静态链接只提供静态库不加static动态链接的局部静态整体动态把.exe用到的部分进行静态链接拷贝其他使用的是动态链接3.你要是使用/lib64里面的库需要写-l库的名称