Linux下的C的开发之GCC的初级使用
<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这个来说,有多少菜鸟用的很熟练?用熟练了,就不会用上 面所说的感觉了,只会说同一个字:爽
直接上例子,具体代码不想写太多,因为我也是从别人的代码中拿来的。。。自己做一个总结而已
例如,我们写一个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缩进之后加命令
#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等工具的使用,慢慢学吧,一起加油。
- 本文来自:Linux学习网
Linux下的C的开发之GCC的初级使用的更多相关文章
- linux驱动开发之GCC问题
最近正在学习驱动开发,进展到字符设备驱动开发阶段. 先不多说,首先把刚看的一篇学习驱动步骤的帖子记录如下: 1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. ...
- 解决linux下oracle-11g打不开dbca问题
linux下oracle安装完毕后,出现建立数据库命令dbca无法使用问题,如图: 解决办法: 在32位的linux环境下,安装32位oracle11g会有这个bug,主要装个补丁(patch nam ...
- [编译] 4、在Linux下搭建nRF51822的开发烧写环境(makefile版)
星期日, 09. 九月 2018 07:51下午 - beautifulzzzz 1.安装步骤 1) 从GNU Arm Embedded Toolchain官网下载最新的gcc-arm工具链,写文章时 ...
- Webstorm 下的Angular2.0开发之路
人一旦上了年纪,记忆力就变得越来越不好. 最近写了许多的博文,倒不是为了给谁看,而是方便自己来搜索,不然一下子又忘记了. 如果恰巧帮助到了你,也是我的荣幸~~~~~~~~~~~~ 废话不多说,看正题~ ...
- 解决linux下/etc/rc.local开机器不执行的原因
前不久因项目需要写了开机启动其他程序的shell脚本,因工作忙,调试完给了技术支持人员,也没去注意过. 到后来,有几台服务器突然被重启了,这时候领导问,怎么开机启动的脚本没起作用,还被批了一顿,哎,做 ...
- Linux下一个进程可以开多少线程
这个问题,整理了一下网上的资料,结果如下: 一.ulimit -n可以查看一个进程最多可以打开多少文件描述符数: 二.一个进程最多可以产生多少线程,可用如下的方法: 32位linux系统最大内存地址4 ...
- linux下安装redis组件报错-gcc报错
报错如图: 1.解决办法 先安装gcc插件.删除redis解压后文件.重新解压
- 在Linux下搭建nRF51822的开发烧写环境(makefile版)
http://www.qingpingshan.com/m/view.php?aid=394836
- Linux下的python3,virtualenv,Mysql、nginx、redis等常用服务安装配置
Linux下的python3,virtualenv,Mysql.nginx.redis等常用服务安装配置 学了前面的Linux基础,想必童鞋们是不是更感兴趣了?接下来就学习常用服务部署吧! 安装环 ...
随机推荐
- ContextMenu菜单创建 上下文菜单的基本认识q
MainActivity.class public class MainActivity extends AppCompatActivity { @Override protected void on ...
- 基本算法 st
今天困得不行,就看了个小算法st,其实和线段树的作用一样, 不过这个算法没有用到数据结构,使用二进制优化的 是O(log(n)n)的时间预处理,然后以O(1)的时间返回(l,r)上的最大或最小 #in ...
- 如何避免重复安装AppiumSetting、Unlock以及Android ime
老版本Appium(如1.4.16),找到如下路径(根据自己的安装路径找) C:\Program Files (x86)\Appium\node_modules\appium\lib\devices\ ...
- 技术学到多厉害,才能顺利进入BAT?
简介 本科的时候对 Linux 特别感兴趣,心中向往成为一名运维工程师,就开始没日没夜的看相关的书籍,到了大约2013年前后的时候发现 DevOps 开始流行起来了,就开始学习 Python 希望成为 ...
- Java8-Stream-No.13
import java.security.SecureRandom; import java.util.Arrays; import java.util.stream.IntStream; publi ...
- 洛谷-P3808-AC自动机(模板)
链接: https://www.luogu.org/problem/P3808 题意: 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. 思路: 模板, 代码: #include < ...
- jQuery+masonry实现瀑布流
增加jQuery组件 <script src="//cdn.bootcss.com/jquery/2.2.1/jquery.min.js "></script&g ...
- 题解 [BZOJ4368][IOI2015]boxes纪念品盒
题面 解析 可以发现,发纪念品有三种方式: 从左边走再原路返回. 从右边走再原路返回. 走一圈. 注意到,第三种走法最多只会走一次, 因为如果走了多次,那发放的物品数量就会>=\(2k\), 那 ...
- [Python自学] day-19 (1) (FBV和CBV、路由系统)
一.获取表单提交的数据 在 [Python自学] day-18 (2) (MTV架构.Django框架)中,我们使用过以下方式来获取表单数据: user = request.POST.get('use ...
- IAT表和导入表
1.关于IAT(import address table)表 当exe程序中调用dll中的函数时,反汇编可以看到,call后面并不是跟的实际函数的地址,而是给了一个地址: