博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[C语言]在命令行编译执行程序
阅读量:6516 次
发布时间:2019-06-24

本文共 3507 字,大约阅读时间需要 11 分钟。

-----------------------------------------------------------------------------------------

【开始】

1. 在Mac和Linux上写C语言之前,首先要看看是否安装了编译器:

  在终端下输入gcc后回车进行检测,如果安装过,将提示 clang: error: no input files(没有输入文件);

 

  如果没有安装,在Mac下根据提示安装Xcode即可,或者Install gcc without xcode in maxOsX:http://osxdaily.com/2012/07/06/install-gcc-without-xcode-in-mac-os-x/  ( OSX命令行工具下载:https://developer.apple.com/downloads/ )

在CentOS下直接yum -y install gcc gcc-c++(-y表示将自动选择y)

 

2. 现在开始愉快的写代码:

  在Xcode里对新建的项目文件使用command+R就直接编译运行你的c代码了。

 

  在Mac终端下,使用神器vim,如:vim test.c ,它不会帮你新建test.c,写完c代码后你需要command+s保存,然后:wq!退出,使用命令gcc test.c编译,不指定编译后的文件名,编译文件名都将是a.out ,运行它使用./a.out

 

  在Linux下,同样使用vim,输入vim test.c 的时候就在当前目录新建了test.c文件,写完c代码直接:wq!保存退出,使用gcc test.c编译,运行编译文件./a.out   ( gcc -o main.c main.o #生成.o文件 )

 

  Sublime Text是一款值得使用的文本编辑器,如果装好环境,使用cmd+B对代码进行编译,shift+cmd+B运行,但是Sublime只能运行一个程序,如果需要运行有输入的程序,就必须离开Sublime进入到终端。

  

  Windows环境下C/C++集成开发环境(IDE)推荐Dev-C++,这里不作过多介绍,下载地址在这里:http://sourceforge.net/projects/orwelldevcpp/?source=directory。

 

3. DEMO:

#include "stdio.h"/* 标准输入流:键盘输入 标准输出流:终端输出 标准错误流:错误输出 stdin stdout stderr */int main(){  printf("nihao,shijie! \n"); //nihao, shijie   //内部实现:fprintf(stdout, "输入一个数:");   int a;   scanf("%d", &a);   //内部实现:fscanf(stdin, "%d", &a);   if(a < 0) {
    fprintf(stderr, "be sure: a > 0\n");     return 1;   } else {
    printf("a > 0\n");   }   return 0; }

 

重定向:./main.out >> m.txt     #执行文件输出结果追加写入到m.txt./main.out > m.txt     #执行文件输出结果覆盖写入到m.txt./main.out < input.txt    #输入流重定向,input.txt作为输入流./main.out 1>t.txt 2>f.txt < input.txt  #输出流写入t.txt, 错误流写入f.txt, 输入流使用input.txt

 

管道:ls /usr/local/ | grep binps -e | grep ssh       #将前一条命令的输出流作为后面命令的输入流

 

 附:

【C语言编译过程】

假如要编译一个 1.c 程序为可执行文件 build,如何看到编译器的处理过程呢,使用 gcc -v -o build 1.c

 

1. 预处理

cpp -o 1.i 1.c  # 翻译成.i文件

gcc -E

 

2. 编译,系统用的是cc1

 /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -o build 1.c

我们可以直接用 gcc -S , 相当于帮我们执行上面的过程;

 

3. 汇编,系统用的是as

 as -o build 1.c

我们可以直接用 gcc -c ,因为系统没有办法直接把c程序转为汇编,所以相当于依次执行了编译和汇编;

 

4. 链接,系统用的是collect2

 /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 -o build 1.c

我们可以直接用 gcc -o ,同理,系统帮我们依次执行了编译、汇编、链接。

 

示例:

gcc -E -o 1.i 1.c  # 生成预处理文件1.i,将其中的include和define等替换成其它

gcc -S -o 1.s 1.c  # 编译成1.s 汇编码文件,-o选项不能省,只是增加了-S选项

gcc -c -o 1.o 1.c  # 编译成1.o 二进制码文件,给机器读

 

由于include和define是预处理阶段完成的替换,所以它们并不是关键字,关键字是编译器处理的。

 

( 条件预处理 )

  gcc -DABC  相当于 #define ABC , 用于调试中。

  

  示例:

include 
int main(){#ifdef ABC printf("%s", __FILE__);#endif printf("hello"); return 0;}

编译时,gcc -DABC -o build 1.c ,-D选项后面直接加常量名,预处理会加入宏定义。

 

不用命令行定义 ARRAY_SIZE 时,值为3:

#include 
int main(){#ifndef ARRAY_SIZE#define ARRAY_SIZE 3#endif int array[ARRAY_SIZE] = {
0}; printf("ARRAY_SIZE is %d\n", ARRAY_SIZE); perror("error msg"); return 0; }

gcc -o build 1.c -DARRAY_SIZE=2

 

( 宏展开下的#, ## )

  #  字符串化

  ##  连接符号

 

  #define ABC(x) #x      // 宏体相当于字符串x,在宏中想赋值字符串的时候使用

  #define ABC(x) day##x   // 宏体相当于day连接x后的内容

 

  示例:

include 
#define FUNC(x) #x#define PAR(x) myparam##xint main(){ int myparam1 = 10; int myparam2 = 20; printf(FUNC(abc\n)); // 输出abc\n printf(PAR(1)); // 输出10 printf(PAR(2)); // 输出20 return 0;}

 

  例2:内核中用例,传入不同的后缀可以得到不同的值

#define ADM8211_SRAM(x) (priv->pdev->revision < ADM8211_REV_DB ? \    ADM8211_SRAM_A_ ## x : ADM8211_SRAM_B_ ## x)#define ADM8211_SRAM_INDIV_KEY   0x0000#define ADM8211_SRAM_A_SHARE_KEY  0x0160#define ADM8211_SRAM_B_SHARE_KEY  0x00c0#define ADM8211_SRAM_A_SSID     0x0180#define ADM8211_SRAM_B_SSID     0x00d4

 

Linux 下我们用man可以看到完整的手册,如果想看一些常用选项,建议你用 `gcc --help`:

 

Link:

转载地址:http://ueafo.baihongyu.com/

你可能感兴趣的文章
Tiny4412 开发板 编译环境搭建【转】
查看>>
为你的网站加上SSL,可以使用HTTPS进行访问
查看>>
软件project--谈项目开发
查看>>
Android studio及eclipse中的junit单元測试
查看>>
几个英文网站
查看>>
在Android中创建文件
查看>>
爬虫基础
查看>>
JS组件系列——再推荐一款好用的bootstrap-select组件,亲测还不错
查看>>
CNN网络--AlexNet
查看>>
getopt--parse command line options
查看>>
闭包和OC的block的本质
查看>>
每天一个linux命令(34):du 命令
查看>>
MySQL出现Waiting for table metadata lock的场景浅析
查看>>
C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)
查看>>
什么是数据埋点?
查看>>
git回滚
查看>>
vue2.0 引用qrcode.js实现获取改变二维码的样式
查看>>
Python 判断闰年,判断日期是当前年的第几天
查看>>
activiti 清库脚本(转)
查看>>
如何快速查看服务器配置信息?
查看>>