博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
嵌入式成长轨迹14 【嵌入式环境及基础】【Linux下的C编程 上】【gcc、gdb和GNU Make】...
阅读量:4983 次
发布时间:2019-06-12

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

 

这一模块中,c语言基础,指针、函数及自定义数据类型,数据结构,文本编辑器这几块已经学习过,这些就不再提及,就分别列举一些面试题:

·c语言基础

常见面试题1:下面的两种if语句判断方式,哪种写法更好?为什么?
   if (n == 10)
   if (10 == n)
常见面试题2:下面的两个定义有何区别?
   const int MAX_NUM = 10;
   #define MAX_NUM 10

·数据结构

常见面试题1:栈和队列的主要差别是什么?
常见面试题2:编写一个函数,实现双链表中指定节点的删除操作。

·文本编辑器

常见面试题1:vi编辑器有哪几种工作模式?
常见面试题2:使用vi编辑器编写源代码文件时,如何进行关键字的补全?
常见面试题3:在emacs编辑器中,保存文件的命令有哪些?

 

一、gcc

GCC(GNU Compiler Collection)是一套功能强大、性能优越的编程语言编译器,它是GNU计划的代表作品之一。GCC以GPL和LGPL许可证发行,它是类Unix和苹果电脑Mac OS X操作系统的标准编译器。

1  基本选项

-E 只做预处理
-S 只做预处理和编译
-c 只做预处理、编译和汇编
-o file  指定输出文件为file

2  警告选项

1)说明
在编译程序的过程中,编译器的报错和警告信息对于程序员来说是非常重要的。GCC包含了完整的出错检查和警告提示功能,它们可以帮助Linux程序员尽快找到错误的或潜在的错误代码,从而写出更加专业和优美的代码
2)选项
-Wall 启用所有警告信息
-Werror 发生警告时取消编译操作,也即将警告当做错误
-w 禁用所有警告信息

3  优化选项

GCC具有优化代码的功能,主要的优化选项包括:
-O0:不进行优化处理;
-O或-O1:进行基本的优化,这些优化在大多数情况下都会使程序执行得更快
-O2:除了完成-O1级别的优化外,还要一些额外的调整工作,如处理器指令调度等,这是GNU发布软件的默认优化级别;
-O3:除了完成-O2级别的优化外,还进行循环的展开以及其它一些与处理器特性相关的优化工作;
-Os:生成最小的可执行文件,主要用在嵌入式领域。

4  连接器选项

-Idirectory 向GCC的头文件搜索路径中添加新的目录

-Ldirectory 向GCC的库文件搜索路径中添加新的目录
-llibrary 提示连接程序在创建可执行文件时包含指定的库文件
-static 强制使用静态链接库
-shared 生成动态库文件

库文件可分为静态库和动态库。

静态库是指编译连接时,将库文件的代码全部加入到可执行文件中,这样运行时就不需要库文件了。静态库的后缀名一般为“.a”。
动态库是指在编译连接时并不将库文件的代码加入到可执行文件中,而是在程序执行时由运行时连接文件加载库文件,这样可以节省系统的开销。动态库的后缀名一般为“.so”。

例如我们编译是用-I选项来指定头文件的路径:

$ gcc example.c –o example –I/home/xxx/include
头文件所对应的库文件,如果没有特别指定时,GCC会到默认的搜索路径进行查找。

使用-L选项来指定库文件的路径,例如:

$ gcc example.c –o example –L/home/xxx/lib

GCC编译器在默认情况下使用动态库,但如果使用了-static选项,连接器将忽略动态库,强制使用静态链接库,即使用如下命令:

$ gcc example.c –o example –static –lm
此时静态库文件中的代码全部包含到可执行文件中,所以生成的可执行文件比较大。

5  其它选项
-x language 指定输入文件的编程语言
-v    显示编译器的版本号
-g    获得有关调试程序的详细信息
-ansi 支持符合ANSI标准的c程序

常见面试题1:GCC对程序进行编译连接时使用的是动态库还是静态库,如何进行指定?

常见面试题2:GCC编译器具有优化代码的功能,主要包括哪些优化选项,最常用的是哪个选项?

 

二、gdb
同GCC编译器一样,GDB(GNU Debugger)也是由GNU计划完成的、受通用公共许可证(GPL)保护的自由软件。GDB是一个功能强大的交互式程序调试工具,主要工作在字符模式下。

GDB调试器有很多命令,从简单的文件载入、断点设置,到复杂的内存查看、信号捕捉等。

在使用GDB调试程序之前,必须使用-g选项编译源文件,以便将调试信息加入到要调试的程序之中,而且-g选项不能和优化选项一起使用。

1、断点设置与管理

断点设置即在调试的程序中设置断点,断点管理包括查看断点信息、删除或禁用断点等。
1).设置断点(break)
2).查看断点信息(info break)
3).删除指定的断点(d)
4).删除指定行上的断点(clear)
5).禁用指定的断点(disable)
6).恢复指定的断点(enable)
7).设置观察点(watch)

2、数据显示与变量赋值

上面介绍了如何在程序中设置和管理断点,但只有断点没有用,要跟踪程序的运行,必须能在断点处查看或修改变量的值。
1).显示变量或表达式的值(print)
2).自动显示变量或表达式的值(display)
3).显示变量的数据类型(whatis、ptype)
4).修改变量的值(set)

3、程序执行与函数调用

上面已经介绍了run命令和continue命令,接下来介绍程序执行相关的另外一些常用命令,以及函数调用的命令。
1).单步执行(step、next)
2).退出被调用的函数(return)
3).执行到指定行(until)
4).跳转执行(jump)
5).强制调用函数(call)

4、其他常用命令

GDB的命令很多,除了上面介绍的断点设置、数据显示、程序执行等,还有一些命令比较常用,下面分别介绍。
1)查看堆栈信息(backtrace、frame)
2)查看源程序信息(info source)
3)查看寄存器(info registers)
4)查看程序的汇编代码(disassemble)

5、其它调试工具

GDB是基于字符界面的,Linux系统下还有一些基于图形界面的调试工具,如KDBG、XXGDB以及DDD等。用户只需要单击菜单或按钮即可完成程序的调试,而不需要输入命令。其实这些工具都是GDB的一层外壳,都保留着GDB的各种特性。

常见面试题1:GDB的主要功能是什么?

常见面试题2:使用GDB调试程序时,如何设置断点?

三、GNU Make

GNU Make工具的作用就是实现上面编译连接过程的自动化。它定义了一种语言,用来描述源文件、目标文件以及可执行文件之间的关系,通过检查文件的时间戳来决定程序中哪些文件需要重新编译,并发送相应的命令

1、基本规则

Makefile文件的作用是告诉Make工具做什么,多数情况是如何编译连接一个程序。

 目标 : 依赖

 <tab>命令
如:
example : sort.o compute.o main.o
 gcc sort.o compute.o main.o -o example
sort.o : sort.c lib1.h
 gcc -c sort.c -o sort.o
compute.o : compute.c
 gcc -c compute.c -o compute.o
main.o : main.c lib2.h
 gcc -c main.c -o main.o

2、变量的定义与使用

1).递归展开式变量
  A = $(B)
  B = $(C)
  C = Hello
  $(A)
2).直接展开式变量
  A = Hello          
  B = $(A) World       
  A := Hi
其中
  B := Hello World       
  A := Hi           

  B = $(A) World

  A = Hi
其中
  B := World
  A := Hi

3、隐含规则

隐含规则是系统或用户预先定义好的一些特殊规则,主要是一些常用的依赖关系和更新命令。

.c :

 $(CC) $(CFLAGS) -o $@ $<
.c .o :
 $(CC) $(CFLAGS) -c $<

objects = sort.o compute.o main.o

CC = gcc
CFLAGS = -Wall -g
example : $(objects)
 $(CC) $^ -o $@
sort.o : lib1.h
main.o : lib2.h

4、伪目标

Makefile文件中的目标分为两类:实目标和伪目标。实目标是真正要生成的以文件形式存放在磁盘上的目标,我们前面定义的目标都属于实目标;而伪目标则不要求生成实际的文件,它主要用于完成一些辅助性操作。

  clean :

   rm example $(objects)

  make clean

  .PHONY : clean

  clean :
   rm example $(objects)

5、函数

GNU Make中提供了很多函数,可以在Makefile文件中调用这些函数来进行文件名、变量以及命令等的处理。函数的调用方式与变量类似,使用“$”符号
1).patsubst函数,对字符串进行替换和分析

   $(patsubst pattern,replacement,text)

   $(patsubst %.c, %.o, sort.c compute.c main.c)

   sort.o compute.o main.o
   $(var:suffix = replacement)
   $(patsubst %suffix, %replacement, $(var))

2).dir函数 获取路径
   $(dir filename ... )

   $(dir main.c)

   ./

3).notdir 函数 抽取字符串中除了路径外其他字符,也就是文件名
   $(notdir filename ... )

   $(notdir /home/yanyb/LinuxC/make/main.c ./Makefile)

   main.c Makefile

4).suffix函数 获取文件名后缀
   $(suffix filename ... )

   $(suffix ./main.c)

   .c

6、通用Makefile文件

下面给出的是一个通用的Makefile文件,其作者是英国的Gorge Foot,之所以说它是通用的,主要是它不需要修改就可以应用于大部分的项目之中。

1 ######################################  2 #  3 # Generic makefile  4 #  5 # by George Foot  6 # email: george.foot@merton.ox.ac.uk  7 #  8 # Copyright (c) 1997 George Foot  9 # All rights reserved. 10 # 11 # No warranty, no liability; 12 # you use this at your own risk. 13 # 14 # You are free to modify and 15 # distribute this without giving 16 # credit to the original author. 17 # 18 ###################################### 19 # 20 # Customizing 21 # 22 # Adjust the following if necessary; EXECUTABLE is the target 23 # executable’s filename, and LIBS is a list of libraries to link in 24 # (e.g. alleg, stdcx, iostr, etc). You can override these on make’s 25 # command line of course, if you prefer to do it that way. 26 27 # EXECUTABLE为目标的可执行文件名,LIBS为需要连接的程序包列表,可以根据具体的项目对其进行修改。 28 # 29 EXECUTABLE := example 30 LIBS := xxx 31 32 # Now alter any implicit rules’ variables if you like, e.g.: 33 # 修改隐含规则中宏。 34 CC := gcc 35 CFLAGS := -Wall -O2 -MD 36 37 # You shouldn’t need to change anything below this point. 38 # 下面内容基本上不需要修改。 39 # 列出工作目录下所有以“.c”结尾的文件,以空格分隔,将文件列表赋给变量SOURCE 40 SOURCE := $(wildcard *.c) 41 # 调用patsubst函数,生成与源文件对应的“.o”文件列表。 42 OBJS := $(patsubst %.c, %.o, $(SOURCE)) 43 # 调用patsubst函数,生成与源文件对应的“.d”文件列表,关于“.d”文件后面会给出说明。 44 DEPS := $(patsubst %.o, %.d, $(OBJS)) 45 # 对DEPS列表进行处理,删除所有已经存在的项目。 46 # 这里使用的函数为filter-out,该函数使用两个用空格分割的列表作为参数,其功能是删除第2个列表中所有 47 # 存在于第1列表的项目。 48 MISSING_DEPS := $(filter-out $(wildcard $(DEPS)), $(DEPS)) 49 MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d, %.c, $(MISSING_DEPS))) 50 # 声明伪目标。 51 .PHONY : everything deps objs clean veryclean rebuild 52 # 更新可执行程序,并且为每一个源文件生成或更新一个“.o”文件和一个“.d”文件。 53 everything : $(EXECUTABLE) 54 # 为每一个源文件生成或更新一个“.d”文件。 55 deps : $(DEPS) 56 # 为每一个源文件生成或更新一个一个“.o”文件和一个“.d”文件。 57 objs : $(OBJS) 58 # 删除所有“.o”文件和“.d”文件。 59 # 命令前的“@”符号表示在执行make命令的时候,不显示这条命令。 60 clean : 61  @rm -f *.o 62  @rm -f *.d 63 # 完全删除,首先执行clean,然后再删除可执行文件。 64 veryclean : clean 65  @rm -f $(EXECUTABLE) 66 # 完全重建,首先执行veryclean,然后执行everything。 67 rebuild : veryclean everything 68 # Makefile文件中的条件语句。 69 ifneq ($(MISSING_DEPS),) 70 $(MISSING_DEPS) : 71  @rm -f $(patsubst %.d,%.o,$@) 72 endif 73 -include $(DEPS) 74 75 # addprefix函数包含两个参数:文件前缀和列表,其功能是给文件列表的每一项添加一个前缀。 76 $(EXECUTABLE) : $(OBJS) 77  gcc -o $(EXECUTABLE) $(OBJS) $(addprefix -l,$(LIBS))

 

7、GNU Automake简介
总的来说,书写Makefile文件还是比较复杂的,而且还容易出现各种错误。为了减轻程序开发人员维护Makefile文件的负担,GNU提供了一个自动生成Makefile文件的工具,即GNU Automake工具。
1).创建目录并编辑源文件
2).生成并编辑configure.in文件
3).生成aclocal.m4和configure文件
4).生成config.h.in文件
5).创建Makefile.am文件
6).生成Makefile.in文件
7).生成Makefile

常见面试题1:Makefile文件的作用是什么?

常见面试题2:简述使用Automake工具生成Makefile文件的一般步骤。

 

转载于:https://www.cnblogs.com/zeedmood/archive/2012/03/09/2387835.html

你可能感兴趣的文章
被称为“开发者神器”的GitHub,到底该怎么用?
查看>>
(坑集)Django环境配置
查看>>
利用padding-top/padding-bottom百分比,进行占位和高度自适应
查看>>
常用的监控系统资源的工具
查看>>
08ssm三大框架整合以前步骤
查看>>
R语言学习笔记之八
查看>>
正则表达式语法(msdn)
查看>>
MySQL 数据类型 详解 (转载)
查看>>
Maven学习笔记(一)
查看>>
分割线
查看>>
xls的读写
查看>>
用函数创建子进程
查看>>
Myeclipse配置插件
查看>>
gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)
查看>>
蓝桥杯之入学考试
查看>>
新公司java的注解以及springboot的相关注解
查看>>
Unity脚本的生命周期中几个重要的方法
查看>>
poj1552
查看>>
Thinkphp中文水印和图片水印合体集成插件
查看>>
FLASK安装--兼收EZ_INSTALL及PIP
查看>>