Linux程序设计基础(gcc、makefile、gdb)

来源:互联网 发布:emerald数据库 编辑:程序博客网 时间:2024/05/24 04:45

1.GNU风格
(1)函数返回类型说明和函数名分两行放置,函数起始字符和函
数开头左花括号放到最左边。
    如:int
 main(void)
 {
  return 0;
 }
(2)尽量不要让两个不同优先级的操作符出现在相同的对齐方式
中,应该附加额外的括号使得代码缩进可以表示出嵌套。
(3)按照规定方式排版do-while语句:
(4)每个程序都应该以一段简短的说明其功能的注释开头。
(5)请为每个函数书写注释,说明函数是做什么的,需要哪些入
口参数,参数可能值的含义和用途。如果用了非常见的、非标准的东西,或者可能导致函数不能工作的任何可能的值,应该进行特殊说明。如果存在重要的返回值,也需要说明。
    如:int
 main(void)
 {
    /....../ 
           return 0;
 }
(6)不要声明多个变量时跨行,每一行都以一个新的声明开头。
(7)当一个if中嵌套了另一个if-else时,应用花括号把if-else
括起来。
(8)要在同一个声明中同时说明结构标识和变量或者结构标识和
类型定义(typedef)。先定义变量,再使用。
     注意变量要先定义,再函数调用,否则可能编译器会报错。
(9)尽量避免在if的条件中进行赋值。
(10)请在名字中使用下划线以分割单词,尽量使用小写;把大写字母留给宏和枚举常量,以及根据统一惯例使用的前缀。例如,应该使用类似ignore_space_change_flag的名字;不要使用类似iCantReadThis的名字。

2.Linux 内核编程风格(不用限制这么死,根据自己的习惯)
(1)Linux内核缩进风格是8个字符。
(2)Linux内核风格采用K&R标准,将开始的大括号放在一行的最后,而将结束的大括号放在一行的第一位。
(3)命名尽量简洁。不应该使用诸如ThisVariableIsATemporaryCounter之类的名字。应该命名为tmp,这样容易书写,也不难理解。但是命名全局变量,就应该用描述性命名方式,例如应该命名“count_active_users()”,而不是“cntusr()”。本地变量应该避免过长。

Vi的使用:
   3种模式,以及各种命令可查中嵌ppt。
   删除一个目录的所有文件:rm -f *
   vi test.c;注意.c文件是用GCC的编译器来编译。要用小写的c,大写的被认为是用c++,编译器就改变了。

GNU cc(gcc)开发应用程序:

gcc的版本信息:
    一般来说,系统安装后就已经安装和设定好了gcc。在shell的提示符下键入gcc v,屏幕上就会显示出目前正在使用的gcc的版本,同时这可以确定系统所支持的是ELF还是a.out可执行文件格式。
    Linux系统中可执行文件有两种格式。第一种格式是a.out格式,这种格式用于早期的Linux系统以及Unix系统的原始格式。
    可执行和连接的格式(ELF):这种格式很容易实现共享库。ELF格式已经被Linux系统作为标准的格式采用。gcc编译程序产生的所有的二进制文件都是ELF格式的文件(即使可执行文件的默认名仍然是a.out)。较旧的a.out格式的程序仍然可以运行在支持ELF格式的系统上。

gcc的使用:
gcc的使用格式如下:
$ gcc [options][filenames]
选项查看中嵌ppt。
如果不加参数直接打:gcc test.c,会编译生成默认的执行文件a.out。
执行一个程序:./a.out
若打:gcc -o test test.c.则是生产可编译的test文件。
gcc -g test test.c,生成的可执行程序包含调试信息。
gcc -c test.c,生成目标文件.o。

使用优化选项:
    有很多选项可用于告诉gcc,在耗费更多编译时间和牺牲易调试性的基础上,产生更小更快的可执行文件。这些选项中最典型的是-O和-O2选项。
    -O选项告诉gcc对源代码进行基本优化。这些优化在大多数情况下都会使程序执行的更快。
   -O2选项告诉gcc产生尽可能小和尽可能快的代码。-O2选项将使编译的速度比使用-O 时慢。但通常产生的代码执行速度会更快。

使用调试和剖析选项:
    GCC 支持数种调试和剖析选项。在这些选项里最常用的是-
g和-pg选项。
    -g选项告诉gcc产生能被GNU调试器使用的调试信息以便调试程序。gcc 提供了一个很多其他C编译器里没有的特性,在gcc里能使-g和-O(产生优化代码)连用。这一点非常有用,因为能在与最终产品尽可能相近的情况下调试代码。同时使用这两个选项时必须清楚所写的某些代码已经在优化时被gcc作了改动。
    -pg选项告诉gcc在程序里加入额外的代码,执行时,产生
gprof用的剖析信息以显示程序的耗时情况。

使用GNU make编译makefile:

    makefile是工程管理文件,统一管理代码。
    要使用make,必须编写一个叫做Makefile的文件,这个文件描述了软件包中文件之间的关系,提供更新每个文件的命令。一般在一个软件包里,通常是可执行文件靠目标文件来更新,目标文件靠编译源文件来更新。
    Makefile写好之后,每次改变了某些源文件,只要执行make命令:
    # make
    所有必要的重新编译将执行。Make程序利用makefile中的数据和每个文件的最后修改时间来确定那个文件需要更新,对于需要更新的文件,make程序执行makefile数据中定义的命令来更新。

makefile文件的基本结构:
    GNU make的主要功能是读进一个文本文件makefile并根据makefile的内容执行一系列的工作。makefile的默认文件名为GNUmakefile、
makefile或Makefile,当然也可以在make的命令行中指定别的文件名。如果不特别指定,make命令在执行时将按顺序查找默认的makefile文件。多数Linux程序员使用第三种文件名Makefile。因为第一个字母是大写,通常被列在一个目录的文件列表的最前面。

一个Makefile文件主要含有一系列的规则,每条规则包含
以下内容:
    一个目标(target),即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如“clean”。
    一个或多个依赖文件(dependency)列表,通常是编译目标文件所需要的其他文件。
    一系列命今(command),是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,且每个命令行的起始字符必须为TAB字符。

例如,有以下的Makefile文件:
# 一个简单的Makefile的例子
# 以#开头的为注释行
test:  prog.o code.o(依赖文件,test是目标文件)
 gcc –o test prog.o code.o(编译规则)
prog.o:prog.c prog.h code.h(依赖文件)
 gcc –c prog.c –o prog.o
code.o:code.c code.h
 gcc –c code.c –o code.o
clean:
 rm –f *.o
一般情况下,调用make命令可输入:
# make target
    target是Makefile文件中定义的目标之一,如果省target,make就将生成Makefile文件中定义的第一个目标。对于上面Makefile的例子,单独的一个“make”命令等价于:
# make test

makefile中的变量:
    makefile中的变量可以保存文件名列表,保存可执行命令名,如编译器,保存编译器参数,可方便修改它们。
    Makefile中的变量是用一个文本串在Makefile中定义的,这个文本串就是变量的值。只要在一行的开始写下这个变量的名字,后面跟一个“=”号,以及要设定这个变量的值即可定义变量,下面是定义变量的语法:
    VARNAME=string
    使用时,把变量用括号括起来,并在前面加上$符号,就可以引用变量的值:
    ${VARNAME}
现在利用变量把前面的Makefile重写一遍:
OBJS=prog.o code.o(保存文件名列表)
CC=gcc(保存编译器)
test:  ${ OBJS }
 ${ CC } –o test ${ OBJS }
prog.o:prog.c prog.h code.h
 ${ CC } –c prog.c –o prog.o
code.o:code.c code.h
 ${ CC } –c code.c –o code.o
clean:
 rm –f *.o

gcc的参数:-wall的作用是打印所有的警告信息。

利用makefile的隐含规则,可以简化为:
OBJS=prog.o code.o
CC=gcc
test:  ${ OBJS }
 ${ CC } –o $@ $^
prog.o:prog.c prog.h code.h(没有写,用默认规则:产生目标                                文件的命令都是从“.c”的C语言                              源文件和相关文件通过编译产生                             “.o”目标文件)
code.o:code.c code.h
clean:
 rm –f *.o
它们含义和默认规则可以查中嵌ppt。

调试工具GDB:
    Linux系统中包含了GNU 调试程序gdb,它是一个用来调试C和C++ 程序的调试器。可以使程序开发者在程序运行时观察程序的内部结构和内存的使用情况。注意gdb调试的执行文件,不是源文件。
    编译的时候一定要加-g选项才能用GDB来调试。
    可以用下面的方式来运行gdb:
    gdb filename
    gdb的各种命令可查ppt。
    常用命令:
    list:显示源代码;
    run:运行代码;
    break n:在第n行设置断点;
    next:单步运行;
    watch n:调试时查看变量n;
    quit:退出gdb;

 

原创粉丝点击