<span style="font-family: Arial, Helvetica, sans-serif; "><span style="white-space:pre"> </span>Linux下的C开发,可能与win平台的C有点不太同样,但可能不太多,遇到再说吧,咱们今天要说的就是GCC的使用技巧(初级的),彻底菜鸟级的!!</span>
不少人的感受,特别是离开win平台,到Linux平台写C代码的时候,熟练VIM编辑器以后,最初写代码的感受多是。。。。没啥不同。或 者感受也没有传说中那么神秘,没错,我当初也是这个感受,其实那是由于会的东西太少。。就拿GCC这个来讲,有多少菜鸟用的很熟练?用熟练了,就不会用上 面所说的感受了,只会说同一个字:爽linux
直接上例子,具体代码不想写太多,由于我也是从别人的代码中拿来的。。。本身作一个总结而已shell
例如,咱们写一个main方法,要实现比较两个整数的大小,分别有两个方法供调用,分别是max(int a,int b)和min(int a,int b),最初的模式,咱们通常是把这几个方法写到同一个.c文件中,这个没错,可是若是咱们有上千万个这种方法让你调用,你都要本身写到一个文件中?确定不 合适,最好的方法就是这么多的方法,是来自各个不一样人写的,放在不一样的文件中,多是一个方法一个文件,这样单列的,那么咱们怎样才能经过gcc调用这些 方法呢?编程
例如,有min.c,max.c和一个主方法文件hello.c 首先。。 gcc -c max.c gcc -c min.c 或者:gcc -c max.c min.c 没有错误的话,会产生: max.o,min.o这两个文件 而后: gcc max.o min.o hello.c -o hello.out 产生hello.out文件(没错误的前提下) 最后:./hello.out 输出结果
把这个情景脑补成有几万个方法文件。。。光编译也会烦死,弄很差出错了,再重来。。。那么问题来了,怎么办?那就是make工具,这个工具很强 大,强大到我只会用一部分功能,尚未达到哪里不爽改哪里的境界。。好吧,怎么用呢?那就是先定义规则,再make,规则在哪里定义?在Makefile 文件中,怎么写规则呢?编辑器
很简单,目标:依赖,下一行TAB缩进以后加命令ide
#this is makefile hello.out:max.o min.o hello.c<TAB>gcc max.o min.o hello.c -o hello.out max.o:max.c<TAB>gcc -c max.c min.o:min.c<TAB>gcc -c min.c
这就是Makefile文件的内容,而后咱们直接shell中执行make命令便可,就能够按照这个规则执行了,那么在第三行中,可能有个问题,就是若是仍是有几万个文件让你写上去,岂不是很麻烦?固然有简单的办法。。。Linux就是为懒人设计的。。。改为函数
#this is makefile hello.out:max.o min.o hello.c<TAB>gcc $^ -o $@ max.o:max.c<TAB>gcc -c max.c min.o:min.c<TAB>gcc -c min.c
注意到变化了吗?$^表示全部依赖,就是指的各类.o文件,$@就是指的目标文件,就那么一个,就是上面的hello.out,最会也是 make执行便可,这里的好处是简化了用户输入的复杂性,还有个好处,就是每次更改一个文件的时候,只要.o文件存在,就不会重复编译,从而提升了效率。工具
顺便提一下Linux的管道,咱们知道Linux的IPC(进程间通讯)机制主要有:信号,管道,IO重定向,share内存和套接字等,咱们 常用的就是管道和IO重定向,管道就是“|”,这个竖杠就是管道,重定向就是“>,<,>>,<<”这些符 号,“>”和">>"的区别是,一个是覆盖的,另外一个是追加到文件后面的,仍是说管道,咱们写程序的时候,会碰到一种状况,就是上一个 函数的输出就是下个函数的输入,这种状况若是还要从新编程的话,时间效率不高,管道就提供了个很好的方法,可是必定要注意输入和输出啊,起码要保证类型和 数量是一致的才能用,例如,一个avg方法统计平均数(须要输入总和与个数),一个sum方法会根据输入统计出总和和个数,可是这两个方法是来自两个不一样 文件的,也就是说最后产生的可执行文件是:avg.out和sum.out(也能够本身定义其余名字,这里只是举例说明),咱们想要把sum中的输出直接 放到avg的输入中,怎么办?管道来办,具体方法是命令行输入:./sum.out | ./avg.out,ok执行(这俩文件要放到一个目录里。),就这么简单。。想当初我也不会。。。我傻傻的人工输入。。。后来聪明了,写了个脚本,采集 输出而后按照格式解析出来,再传到目标函数中,尼玛都是不会用管道惹的祸。学习
后面还要实践gdb和ddd等工具的使用,慢慢学吧,一块儿加油。this
本文来自:Linux学习网spa