四、Linux环境基础开发工具
gcc和g++
动静态库的理解
动态库的优点:比较节省资源,不会出现太多重复代码。
动态库的缺点:对库的依赖性比较强,一旦库丢失,所有使用这个库的程序都无法运行。
静态库的优点:不依赖库,同类型平台中都可以直接使用。
静态库的缺点:可执行程序体积比较大,比较浪费资源。
怎么静态链接呢?可以在gcc后面加上 -static 选项。
由于云服务器里面默认没有安装静态库,所以我们在使用静态库前需要手动安装一下静态库。
sudo yum install -y glibc-static libstdc+±static
动态链接 是 gcc 的默认链接方式。
make和Makefile
make 是一个命令,makefile 是一个文件。makefile里面存的是不同文件之间的依赖关系个依赖方法。
注意第二行是一个 tab ,不是空格!
mybin(目标文件):mytest.c(依赖文件列表)
使用 make 可以构建项目,那怎么清楚项目呢?我们需要在 Makefile 里面加点东西。
为什么我们 make 的时候不需要指定名字呢?而执行 make clean 则需要带上 clean ?其实是,make 默认的是 Makefile 文件里的从上往下第一个目标文件,所以不需要写 make mybin 的后半部分。而且我们发现make的时候并没有执行 make clean ,所以我知道: make 默认只执行一个,
当依赖文件未被更新的时候,是无法多次 make 的,如果想要使其 mybin 能够总是被执行,可以在 Makefile 里加上:
但是不建议将目标文件修饰成一个伪文件。更建议将 clean 给修饰成一个伪文件。
以后修改Makefile的时候,只需要修改上面那部分变量就可以了。
Linux小程序—进度条
注意先测试自己写的 Makefile 是否能用。接下来继续编写 mytest.c 文件。
但是明明是 printf 先执行,为啥先 sleep 呢?其实 printf 其实已经跑完了,只是被缓冲区保存起来了,直到程序退出的时候才被刷新出来。
我们继续写 mytest.c 文件:
当然我们要做的是进度条而不是倒计时,我们这里还只是知识储备而已。
1 #include <stdio.h> 2 #include <unistd.h> 3 #include <string.h> 4 5 #define MAX 101 6 #define LABLE '#' 7 8 int main() 9 { 10 char bar[MAX]; 11 memset(bar, '\0', sizeof(bar)); 12 int i = 0; 13 while (i <= 100) 14 { 15 printf("%s\r", bar); 16 // 刷新缓冲区 17 fflush(stdout); 18 bar[i++] = LABLE; 19 // 微秒级别 20 usleep(100000); 21 } 22 printf("\n"); 23 return 0; 24 }
到这里还没有结束,我们下篇再实现更加精细的进度条。