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基础,想必童鞋们是不是更感兴趣了?接下来就学习常用服务部署吧! 安装环 ...
随机推荐
- php连接oracle oracle开启扩展
<?php /** * 由于公司的需要,使用php+oracle开发项目,oracle因为有专门人员开发设计,我们只需远程调用 *于是乎遇到了蛋疼的问题就是开启oracle扩展的问题,虽然你在p ...
- linux-2.6.38 input子系统(用输入子系统实现按键操作)
一.设备驱动程序 在上一篇随笔中已经分析,linux输入子系统分为设备驱动层.核心层和事件层.要利用linux内核中自带的输入子系统实现一个某个设备的操作,我们一般只需要完成驱动层的程序即可,核心层和 ...
- C - Calculation 2 HDU - 3501 (欧拉)
Given a positive integer N, your task is to calculate the sum of the positive integers less than N w ...
- Comparing Sentence Similarity Methods
Reference:Comparing Sentence Similarity Methods,知乎.
- u-boot器件驱动模型(Device&Drivers)之uclass (转)
一.剧情回顾 在上一篇链接器的秘密里面我们讲到我们用一些特殊的宏让链接器帮我们把一些初始化好的结构体列好队并安排在程序的某一个段里面,这里我例举出了三个和我们主题相关段的分布情况,它们大概如下图所示: ...
- SSH登录卡顿解决方案
在使用ssh远程登录Linux主机时,经常出现需要等待一段时间才能登录,甚至登录超时的情况 原因一:SSH服务器默认开启了DNS的查询功能:UseDNS=yes 当UseDNS选项处于开启状态时,客户 ...
- [React] Create a Persistent Reference to a Value Using React useRef Hook
The useRef is a hook for creating values that persist across renders. In this lesson we'll learn how ...
- 题解 [BZOJ4144] Petrol
题目描述 有一张 n 个点 m 条边的无向图,其中有 s 个点上有加油站.有 Q 次询问(a,b,c), 问能否开一辆油箱容积为 c 的车从 a 走到 b.(a,b均为加油站) 输入格式 第一 ...
- Xilinx FFT IP核缩放因子说明
以1024点FFT为例, reg [9:0] scale_sch = 10'b11_10_01_01_01; 流水线结构中,将每个基 2 的蝶形处理单元视为一个阶段. 每个阶段进行一次数据的缩减,缩减 ...
- 编译参数(-D)
程序中可以使用#ifdef来控制输出信息 #include<stdio.h> #define DEBUG int main() { ; ; int sum = a + b; #ifdef ...