linux静态库和动态库的简单例子
来源:互联网 发布:人工智能能否取代老师 编辑:程序博客网 时间:2024/06/06 01:12
1. 静态函数库
库的名字一般是libxxx.a;利用静态函数库编译成的文件比较大,因为整个函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数库支持,因为所有使用的函数都已经被编译进去了。当然这也会成为他的缺点,因为如果静态函数库改变了,那么你的程序必须重新编译。
2. 动态函数库
这类库的名字一般是libxxx.so;相对于静态函数库,动态函数库在编译的时候 并没有被编译进目标代码中,你的程序执行到相关函数时才调用该函数库里的相应函数,因此动态函数库所产生的可执行文件比较小。由于函数库没有被整合进你的程序,而是程序运行时动态的申请并调用,所以程序的运行环境中必须提供相应的库。动态函数库的改变并不影响你的程序,所以动态函数库的升级比较方便。linux系统有几个重要的目录存放相应的函数库,如/lib和/usr/lib。
例子:输出一个菜单,选择1打印矩形,选择2打印菱形,选择0退出系统,其他数字打印非法选择。
代码:
graphic.c–画矩形和菱形的函数
#include <stdio.h>int diamond (int r) { int x,y; for (y=0;y<=2*r;y++) { for (x=0;x<=2*r;x++) { if(y==x+r||y==x-r||y==-x+r||y==-x+3*r) printf("*"); else printf(" "); } printf("\n"); } return 0;}int rectangle(int l){ int x,y; for (y=0;y<=l;y++) { for (x=0;x<=l;x++) { if(y==0||y==l||x==l||x==0) printf("*"); else printf(" "); } printf("\n"); } return 0;}
menu.c–打印菜单的函数
#include<stdio.h>int menuSelect(){ int r; printf("请根据菜单提示输入数字:\n"); printf("输出矩形:1\n输出菱形:2\n退出:0\n"); scanf("%d",&r); return r; }
main.c–主函数
#include <stdio.h>int main(){ int i; int r; i=menuSelect(); while(1) { if(i==1) { printf("请输入矩形半径r:"); scanf("%d",&r); rectangle(r); } if(i==2) { printf("请输入菱形半径r:"); scanf("%d",&r); diamond(r); } if(i==0) { printf("退出系统\n"); return 0; } if(i!=1&&i!=2&&i!=0) { printf("请输入有效选择!\n"); } i=menuSelect(); }}
静态库的编译代码: static.mk
demo: gcc -c -static graphic.c gcc -c -static menu.c gcc -shared -olibdemo.a menu.o graphic.o gcc main.c -omain -ldemo -L.
编译完成之后执行下面这行代码就可以得到结果了。
[zhangben@localhost ex2]$ make -f static.mk demo/*注释部分为执行上面命令打印出来的,如果不想打印可以在上面.mk文件每条命令行全面加上@符号gcc -c -static graphic.cgcc -c -static menu.cgcc -shared -olibdemo.a menu.o graphic.ogcc main.c -omain -ldemo -L. */[zhangben@localhost ex2]$ ./main
动态库的编译代码: demo.mk
demo: gcc -c -fpic graphic.c gcc -c -fpic menu.c gcc -shared -olibdemo.so menu.o graphic.o gcc main.c -omain -ldemo -L.
编译完成之后执行下面这行代码就可以得到结果了。
[zhangben@localhost ex2]$ make -f demo.mk demo/*同上gcc -c -fpic graphic.cgcc -c -fpic menu.cgcc -shared -olibdemo.so menu.o graphic.ogcc main.c -omain -ldemo -L. */[zhangben@localhost ex2]$ ./main
有些人在执行完上面的命令行之后可能会提示找不到动态库。可以先执行这条命令:
export LD_LIBRARY_PATH=.
这样就可以找到了。这只是其中一种比较简单的方法。还有两种将动态库拷贝/lib和/usr/lib目录下,但是需要root权限,想了解的可以去百度一下。当然动态库的链接也可以用函数实现
下图是程序运行结果图:
- linux静态库和动态库的简单例子
- windows下的静态库和动态库 -- 简单例子
- 创建动态库和静态库的简单例子
- 【静态库&动态库】用最简单的例子说明静态库动态库的操作
- Linux的静态库和动态库
- linux 的动态库和静态库
- Linux的静态库和动态库
- linux的动态库和静态库
- linux静态链接库和动态链接库简单使用
- linux动态库及静态库的制作 和makefile 的简单编写
- linux动态库及静态库的制作和makefile的简单编写
- linux下动态库静态库的简单编译和链接
- linux 动态静态库和动态库的区别
- 创建简单的静态库和动态库
- iOS动态库和静态库的简单使用
- 静态库和动态库的简单区别分析
- Linux静态库和动态库的编写和使用
- Linux静态库和动态库的编写和使用
- 26、获取软件信息(包括Lable和相应的应用程序的包名)
- 栋栋晓03:什么是web标准?
- 从今天开始我遇到所有问题及解决办法我都要写博客了
- Android数据库ORMlite框架翻译系列(第一章)
- 第六课 画图板 lesson 03 第三版 (优化功能:铅笔)
- linux静态库和动态库的简单例子
- mysql手册中值得注意的知识点
- man 命令的详细用法
- CSDN Code Git设置和项目初始化
- ssh的安装
- Oracle如何删除表空间、删除用户
- [LeetCode 110]Balanced Binary Tree
- (8.1.1)网站性能测试:pylot
- 获取报告 Stream转string,利用字符串分割转换成DataTable