linux-c 开发环境

c 语言的开发过程和其他语言一样,都是 编写代码-调试代码-编译-运行。下面介绍这个过程中需要用到的工具。

编辑器

Linux 上最常用的编辑器是 vi/vim,但说实在,上手成本有点高。所以我建议用 VS Code 就行了,写完后将文件拷贝过去运行。

调试工具

调试器用于寻找程序中的错误。为此,GNU 开发了 GDB调试器(GNU Debugger)。GDB 的功能可以与 VC++ 等开发工具相媲美,唯一的缺点是没有图形界面。后续等到编写复杂的程序后,我们会介绍如何使用 GDB)

编译器

C program compilation process

编译器用于将程序编译并链接到一起。目前 Linux 下常用的 C 语言编译器是 GCC(GNU Compiler Collection),它可以为 x86、ARM、MIPS 等不同体系结构的硬件平台编译程序,并且效率也优于其他编译器。GCC 编译程序的过程分为四阶段:

  1. 预处理(Pre-Processing)
  2. 编译(Compiling)
  3. 汇编(Assembling)
  4. 链接(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

  1. 总体选项:
    • -E 对源文件进行预处理
    • -c 对源文件进行编译或汇编
    • -S 对源文件进行编译
    • -o file 输出目标文件 file
    • -v 显示编译阶段
  2. 语言选项:
    • -ansi 支持 ANSI标准的 C 语言
  3. 警告选项:
    • -W 屏蔽所有的警告信息
    • -Wall 显示所有类型的警告信息
    • -Werror 出现任何警告信息就停止编译
  4. 调试选项
  5. 优化选项:
    • -O0 不进行优化
    • -O1 对目标文件的性能进行优化
    • -O2-O1 基础上进一步优化
    • -O3-O2 基础上进一步优化
  6. 链接选项
    • -static 使用静态链接
    • -llibrary 链接library函数库文件
  7. 目录选项
    • -I dir 指定头文件的搜索目录 dir
    • -L dir 指定搜索目录 dir

工程管理器

对于多个源文件组成的程序,gcc 命令会非常复杂;并且 gcc 会每次都将所有文件都编译一次,非常耗时。所以我们需要使用工程管理器 make 来代替 gcc,make 会根据 makefile 自动编译和链接文件,生成可执行文件;并且会自动检查每个源文件的时间戳,只编译修改过的文件。关于 makefile 的编写,我们会在学习多个源文件组成的程序中介绍。