c 语言的开发过程和其他语言一样,都是 编写代码-调试代码-编译-运行。下面介绍这个过程中需要用到的工具。
编辑器
Linux 上最常用的编辑器是 vi/vim,但说实在,上手成本有点高。所以我建议用 VS Code 就行了,写完后将文件拷贝过去运行。
调试工具
调试器用于寻找程序中的错误。为此,GNU 开发了 GDB调试器(GNU Debugger)。GDB 的功能可以与 VC++ 等开发工具相媲美,唯一的缺点是没有图形界面。后续等到编写复杂的程序后,我们会介绍如何使用 GDB)
编译器
编译器用于将程序编译并链接到一起。目前 Linux 下常用的 C 语言编译器是 GCC(GNU Compiler Collection),它可以为 x86、ARM、MIPS 等不同体系结构的硬件平台编译程序,并且效率也优于其他编译器。GCC 编译程序的过程分为四阶段:
- 预处理(Pre-Processing)
- 编译(Compiling)
- 汇编(Assembling)
- 链接(Linking)
程序员可以根据自己的需求让 GCC 在任何阶段结束,以便检查是否有 bug. 关于 GCC 的具体用法,我们以后边学边讲。这里我会先记一些笔记,可以跳过不看。
检查 gcc 是否安装
请先新建一个文件叫 devtoolscheck.sh
,输入以下内容
#!/bin/sh
gcc -v
if [ $? != 0 ]; then
echo "GCC is not installed!"
fi
ld -v
if [ $? != 0 ]; then
echo "Please install binutils!"
fi
保存并运行。
在我的树莓派中显示如下内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/8/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v
--with-pkgversion='Raspbian 8.3.0-6+rpi1'
--with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs
--enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++
--prefix=/usr --with-gcc-major-version-only
--program-suffix=-8
--program-prefix=arm-linux-gnueabihf-
--enable-shared --enable-linker-build-id
--libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --libdir=/usr/lib
--enable-nls --enable-bootstrap
--enable-clocale=gnu --enable-libstdcxx-debug
--enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=new
--enable-gnu-unique-object --disable-libitm
--disable-libquadmath --disable-libquadmath-support
--enable-plugin --with-system-zlib
--with-target-system-zlib --enable-objc-gc=auto
--enable-multiarch --disable-sjlj-exceptions
--with-arch=armv6 --with-fpu=vfp --with-float=hard
--disable-werror --enable-checking=release
--build=arm-linux-gnueabihf
--host=arm-linux-gnueabihf
--target=arm-linux-gnueabihf
Thread model: posix
gcc version 8.3.0 (Raspbian 8.3.0-6+rpi1)
GNU ld (GNU Binutils for Raspbian) 2.31.1
常用选项
gcc [options] filenames
- 总体选项:
-E
对源文件进行预处理-c
对源文件进行编译或汇编-S
对源文件进行编译-o file
输出目标文件 file-v
显示编译阶段
- 语言选项:
-ansi
支持 ANSI标准的 C 语言
- 警告选项:
-W
屏蔽所有的警告信息-Wall
显示所有类型的警告信息-Werror
出现任何警告信息就停止编译
- 调试选项
- 优化选项:
-O0
不进行优化-O1
对目标文件的性能进行优化-O2
在-O1
基础上进一步优化-O3
在-O2
基础上进一步优化
- 链接选项
-static
使用静态链接-llibrary
链接library函数库文件
- 目录选项
-I dir
指定头文件的搜索目录 dir-L dir
指定搜索目录 dir
工程管理器
对于多个源文件组成的程序,gcc 命令会非常复杂;并且 gcc 会每次都将所有文件都编译一次,非常耗时。所以我们需要使用工程管理器 make 来代替 gcc,make 会根据 makefile 自动编译和链接文件,生成可执行文件;并且会自动检查每个源文件的时间戳,只编译修改过的文件。关于 makefile 的编写,我们会在学习多个源文件组成的程序中介绍。