Linux C 编程入门
在 Windows 下我们可以使用各种各样的 IDE 进行编程,比如强大的 Visual Studio。Ubuntu 下也有一些可以进行编程的工具,但是大多都只是编辑器,也就是只能进行代码编辑,如果要编译的话就需要用到 GCC 编译器,使用 GCC 编译器肯定就要接触到 Makefile。本文就讲解如何在 Ubuntu 下进行 C 语言的编辑和编译、GCC 和 Makefile的使用和编写。
实验环境: Ubuntu Linux 16.04.3,VIM编辑器
GCC基础 Hello World!
VIM 准备
- 安装VIM
VIM 编辑器都是一种基于指令式的编辑器,使用键盘来完成所有的编辑工作。
powershell
sudo apt-get install vim
- 设置VIM(方便C代码编写)
VI 编辑器默认 TAB 键为 8 空格,我们改成 4 空格,并且显示行号。用 vi 打开文件/etc/vim/vimrc
在该文件的最下面插入最后面输入如下代码:
set ts=4
set nu
(如果权限不够保存的用root)
编写代码
这里可以新建一个文件夹将我们的文件存在其中方便管理,然后在该文件下使用vi命令新建一个c文件。
输入代码,保存文件
编译代码
Ubuntu 下的 C 语言编译器是 gcc,使用 gcc 编译器来编译 main.c,当编译完成以后会生成一个 a.out 文件,这个 a.out 就是编译生成的可执行文件。
a.out 这个文件名是 GCC 编译器自动命名的,在使用 gcc 命令的时候加上-o 来指定生成的可执行文件名字,比如编译 main.c 以后生成名为"main"的可执行文件
执行代码
执行的方法很简单使用命令:"./可执行文件",比如本例程就是命令:./a.out
编译流程
GCC 编译器的编译流程是:预处理、汇编、编译和链接。
- 预处理:预处理器会先处理源文件,处理后的文件包括头文件内容、宏定义、条件编译等,生成一个中间文件,以供编译器使用。
- 编译:编译器会将预处理后的文件进行编译,生成汇编代码。
- 汇编:汇编器会将编译器生成的汇编代码转化成机器码,生成目标文件。
- 链接:是将多个目标文件(经过编译和汇编生成的文件)合并成一个可执行文件的过程。在链接过程中,链接器会解决函数和变量之间的引用关系,将它们正确地连接在一起。包括静态链接和动态链接两种方式。
Makefile 基础
Makefile
通过在终端执行 gcc 命令来完成 C 文件的编译,如果我们的工程只有一两个 C 文件还好,需要输入的命令不多,当文件有几十、上百甚至上万个的时候用终端输入 GCC 命令的方法显然是不现实的。
工程编译的工具:Make,描述哪些文件需要编译、哪些需要重新编译的文件就叫做 Makefile。这个文件描述了编译哪些源码文件、如何编译,每次需要编译工程的时只需要使用这个文件。Makefile 就跟脚本文件一样,Makefile 里面还可以执行系统命令。在 Linux 下用的最多的是 GCC 编译器,这是个没有 UI 的编译器,因此 Makefile 就需要我们自己来编写了。在 Linux 下需要学会使用 Makefile,再就是通过 Makefile 了解整个工程的处理过程。
Makefile 编写
将main.c 修改为输入两个数字计算和为多少
创建clc.c和clc.h实现功能
c
##clc.c
#include <stdio.h>
#include "clc.h"
void inputvi(int *a, int *b)
{
printf("input two num:");
scanf("%d %d", a, b);
printf("\r\n");
}
int calcu(int a, int b)
{
return (a + b);
}
##clc.h
#ifndef _CLC_H
#define _CLC_H
void input(int *a, int *b);
int calcu(int a, int b);
#endif
Makefile中 -c 是不链接生成 .o,编写时缩进要用TAB
c
## Makefile
main: main.o clc.o
gcc -o main main.o input.o calcu.o
main.o: main.c
gcc -c main.c
clc.o: clc.c
gcc -c clc.c
clean:
rm *.o
rm main
Makefile 执行
如果我们只修改clc.c那么make时只会重新生成clc.o
如果在代码正确的情况下出现错误
- Makefile 中命令缩进没有使用 TAB 键
- VIM 编辑器使用空格代替了 TAB 键,修改文件/etc/vim/vimrc,在文件最后面加上如下所示代码:set noexpandtab
参考资料
- 正点原子 《领航者 ZYNQ 之嵌入式 Linux 开发指南》
- ZYNQ7020教程《ZYNQ 开发平台 Linux 应用教程》