使用gcc编译c语言程序

  • 时间:
  • 浏览:953
  • 来源:成都艾邦软件开发

gcc编译C语言程序的步骤

1.预处理

-E进行预处理工作\t去掉注释内容 进行宏替换和头文件导入或者条件编译等 \t注不会自动生成文件 -o  可以指定生成的目标文件  .i

2.编译

-S检查语法错误  生成汇编程序\t检查源代码或者经过预处理之后代码的语法错误生成汇编程序   .s  

3.汇编

-c\t 把汇编代码汇编成目标文件(二进制  .o

4.链接

 链接一个或者多个目标文件生成可执行程序   默认生成a.out 链接函数调用语法错误检查在编译阶段函数调用检查在链接阶段

预处理指令

在预处理阶段就会进行处理的指令以#开头的指令

#include 包含头文件

导入头文件中的代码调用了标准库的函数时需要导入头文件#include  与 #include 的区别   从系统指定的路径(可配置)搜索包含的头文件   从当前目录搜索包含的头文件注如果在当前目录下没有找到则去系统指定的目录下搜索如果是包含自己写的头文件时用,包含标准库的文件一般用

#define 宏、宏函数

宏名 一般用大写字母宏定义  在预处理阶段进行简单的宏替换\t例#define PI 3.14宏函数\t例#define POW(x) ((x)*(x))预处理阶段不进行运算只进行替换所以在每个参数后边都应该加上小括号。\t注意\t\t1.不要在宏定义后面加上 ;\t\t2.宏函数需要给每个参数都加上小括号 以及最后整体加上小括号 避免产生歧义例#define POW(x) x*xz  POW(xy);//为 xy*xy而不是(xy)*(xy)#define POW(x) ((x)*(x))z  POW(xy)//为(xy)*(xy)3.宏函数和参数列表之间不能有额外的空格\t例#define POW (x) ((x)*(x))  //错误  POW和(x)之间多了一个空格 可以连接宏定义\t一般而言  宏只能放在一行 但是可以通过  来连接多行 作为同一个宏定义\t例#define SWAP(x, y)  xy; yx-y; xx-y;# 可以把一个标识符变成一个字面值字符串\t例1#define TOSTR(x)  #x\t例2#define print(x)  printf(#x%d,x)\t## 可以生成新的标识符\t例#define AGE(n) age##nint main(){int age1  10;int age2  20;printf(%d ,AGE(1));//age1printf(%d,AGE(2));//age2\t\t}结果为10 20\t宏的作用\t1.方便修改\t2.简化编程3.参数没有类型限制  灵活

条件编译

分支选择语句\t只有当执行时才确定执行哪一个分支会把两个分支的语句都编译到代码中去编译时可以选择需要编译的代码#if根据宏的值来进行条件编译#elif \t 综合了#else和#if指令的作用#else#否则 #endif   #条件编译结尾#ifdef   #if defined   如果定义了某个宏   用宏是否定义来进行条件编译#ifndef  如果没有定义某个宏#undef   删除一个宏  取消宏定义#ifdef\tZBS//如果定义了 ZBS 这个宏 则编译该分支#else//如果没有定义  ZBS 这个宏 则编译些分支#endif\t#ifdef LINUX   //如果定义了LINUX宏//linux系统代码#else  //没有定义//其它系统代码#endif宏可以在代码中用  #define 定义也可以在编译时用  -D 宏名称   来定义宏根据宏的值#if N1#elif N2#elif N3#else//宏没有定义 以及不满足上面情况下编译#endif #ifdef/#ifndef/#if defined#endif  //宏是否定义来进行条件编译#if /#elif  #endif//宏的值来进行条件编译多文件编程头文件   .h 文件需要把函数的声明放在.h文件中实现文件放在.c文件中头文件卫士:  用于防止多次引用该头文件如果不加 程序稍微复杂一些就可能引发重复定义的错误#ifndef XXX_H__#define XXX_H__#endif //XXX_H__

多文编程的步骤

1.写一个 .h 文件\t头文件卫士\t函数声明  类型声明   声明全局变量(不是定义)\t2.写.c文件用于实现 .h文件中声明的函数\t需要包含 .h 文件  #include \t检查语法错误 gcc -c  x.c  //只编译和汇编  只检查语法错误 并不会链接\t生成 .o 文件 3.写一个.c 文件里面 写 main函数 调用其它函数\tgcc -c  main.c \tgcc *.o链接所有的目标文件 生成 可执行程序

新人初见ubuntu问题之一gcc编译不了c语言

  • 遇到的问题
    • 检查源代码
    • sudo apt-get install build-essential
    • 切换源
    • sudo apt-get install build-essential
    • 重新编译

遇到的问题

gcc hello.c
hello.c:1:19: fatal error: stdio.h: 没有那个文件或目录
#include stdio.h
^
compilation terminated.

检查源代码

#include stdio.hint main(void){  printf(hello!);  return 0;}

源代码没有错误。

sudo apt-get install build-essential

报错。
正在读取软件包列表… 完成
正在分析软件包的依赖关系树
正在读取状态信息… 完成
有一些软件包无法被安装。如果您用的是 unstable 发行版这也许是
因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件
包尚未被创建或是它们已被从新到(Incoming)目录移出。
下列信息可能会对解决问题有所帮助

下列软件包有未满足的依赖关系
build-essential : 依赖: libc6-dev 但是它将不会被安装 或
libc-dev
依赖: g ( 4:4.4.3) 但是它将不会被安装
依赖: dpkg-dev ( 1.13.5) 但是它将不会被安装
E: 无法修正错误因为您要求某些软件包保持现状就是它们破坏了软件包间的依赖关系。

百度搜索源的问题。

切换源

blogs.com/mliudong/p/4217945.html

sudo apt-get install build-essential

返回信息

update-alternatives: 使用 /usr/bin/g 来在自动模式中提供 /usr/bin/c (c)
正在设置 build-essential (12.4ubuntu1) …
正在处理用于 man-db (2.8.3-2ubuntu0.1) 的触发器 …
正在处理用于 libc-bin (2.27-3ubuntu1) 的触发器 …

重新编译

$ gcc hello.c

$ ll
总用量 24
drwxr-xr-x 2 weiconglin weiconglin 4096 6月 15 12:19 ./
drwxr-xr-x 4 weiconglin weiconglin 4096 6月 14 23:24 …/
-rwxr-xr-x 1 weiconglin weiconglin 8304 6月 15 12:19 a.out*
-rw-r–r-- 1 weiconglin weiconglin 72 6月 14 23:37 hello.c

$ ./a.out
hello!

编译成功