1、linux+vim+gcc+gdb 开发 C/C+程序环境搭建 我用的是 ubuntu 操作系统。打开终端1.sudo apt-get install vim(vim-full 这个软件自 9.10 版本被废弃了,不论怎么添加软件源都找不到的,所以直接安装 vim 就可以了,也可以安装 gvim,在新立得软件里面搜索vim 就可以找到了)2.sudo apt-get install build-essential / build-essential 是 c 语言的开发包,包含了 gcc make gdb 和 libc 函数库 很多工具。 或者 sudo apt-get install gcc
2、+ sudo apt-get install gdb网上有很多版本说要编译安装,这个可能挺复杂的,而且花的时间也不少(没试过阿),不想在命令行中安装的化,可以下载 rpm 包直接点击安装,3.gcc 只是一个编译器,vim 是编辑器(也可以用 gedit 编辑源代码),gdb 是调试器,可以新建一个 test.c 的 helloworld 文件测试以下4.一般 c 程序就用 gcc 编译,c+ 程序就用 g+编译 介绍 - 常见用法: GCC 选项 GCC 有超过 100 个的编译选项可用。这些选项中的许多你可能永远都不会用到,但一些主要的选项将会频繁用到。很多的 GCC 选项包括一个以上的字
3、符。因此你必须为每个选项指定各自的连字符,并且就象大多数 Linux 命令一样你不能在一个单独的连字符后跟一组选项。例如, 下面的两个命令是不同的 : gcc -p -g test.c gcc -pg test.c 第一条命令告诉 GCC 编译 test.c 时为 prof 命令建立剖析 (profile) 信息并且把调试信息加入到可执行的文件里。第二条命令只告诉 GCC 为 gprof 命令建立剖析信息。 当你不用任何选项编译一个程序时, GCC 将会建立 ( 假定编译成功 ) 一个名为 a.out 的可执行文件。例如,下面的命令将在当前目录下产生一个叫 a.out 的文件 : gcc te
4、st.c 你能用 -o 编译选项来为将产生的可执行文件指定一个文件名来代替 a.out 。 例如,将一个叫 count.c 的 C 程序编译为名叫 count 的可执行文件,你将输入下面的命令 : gcc -o count count.c 注意 : 当你使用 -o 选项时 , -o 后面必须跟一个文件名 。 -c 只编译并生成目标文件 。 - gcc and g+ 分别是 gnu 的 c 如果 option 中间有逗号 , 就将 option 分成多个选项 , 然后传递给会汇编程序 -Wl.option 此选项传递 option 给连接程序 ; 如果 option 中间有逗号 , 就将 opt
5、ion 分成多个选项 , 然后传递给会连接程序 . -llibrary 制定编译的时候使用的库 例子用法 gcc -lcurses hello.c 使用 ncurses 库编译程序 -Ldir 制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然 编译器将只在标准库的目录找。这个 dir 就是目录的名称。 -O0 -O1 -O2 -O3 编译器的优化选项的 4 个级别, -O0 表示没有优化 ,-O1 为缺省值, -O3 优化级别最高 -g 只是编译器,在编译的时候,产生调试信息。 -gstabs 此选项以 stabs 格式声称调试信息 , 但是不包括 gdb 调试信息 . -
6、gstabs+ 此选项以 stabs 格式声称调试信息 , 并且包含仅供 gdb 使用的额外调试信息 . -ggdb 此选项将尽可能的生成 gdb 的可以使用的调试信息 . -static 此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么动态连接库,就可以运行 . -share 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库 . -traditional 试图让编译器支持传统的 C 语言特性 参考资料 -Linux/UNIX 高级编程 中科红旗软件技术有限公司编著 . 清华大学出版社出版 -Gcc man page ChangeLog -2002-08-
7、10 ver 0.1 发布最初的文档 -2002-08-11 ver 0.11 修改文档格式 -2002-08-12 ver 0.12 加入了对静态库,动态库的参数 -2002-08-16 ver 0.16 增加了 gcc 编译的 4 个阶段的命令 运行 gcc/egcs * 运行 gcc/egcs* GCC 是 GNU 的 C 和 C+ 编译器。实际上, GCC 能够编译三种语言: C 、 C+ 和 Object C ( C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C+ 源程序。 如果你有两个或少数几个 C 源文件,也可以方便地利用 GCC 编译、连接并生成可执
8、行文件。例如,假设你有两个源文件 main.c 和 factorial.c 两个源文件,现在要编译生成一个计算阶乘的程序。 代码 : - 清单 factorial.c - int factorial (int n) if (n #include int factorial (int n); int main (int argc, char *argv) int n; if (argc void main (void) cout “Hello, world!“ endl; 则可以如下调用 g+ 命令编译、连接并生成可执行文件: $ g+ -o hello hello.C $ ./hello He
9、llo, world! *gcc/egcs 的主要选项 * gcc 命令的常用选项 选项 解释 -ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。 -c 只编译并生成目标文件。 -DMACRO 以字符串 “1” 定义 MACRO 宏。 -DMACRO=DEFN 以字符串 “DEFN” 定义 MACRO 宏。 -E 只运行 C 预编译器。 -g 生成调试信息 。 GNU 调试器可利用该信息。 -IDIRECTORY 指定额外的头文件搜索路径 DIRECTORY 。 -LDIRECTORY 指定额外的函数库搜索路径 D
10、IRECTORY 。 -lLIBRARY 连接时搜索指定的函数库 LIBRARY 。 -m486 针对 486 进行代码优化。 -o FILE 生成指定的输出文件。用在生成可执行文件时 。 -O0 不进行优化处理。 -O 或 -O1 优化生成代码。 -O2 进一步优化。 -O3 比 -O2 更进一步优化,包括 inline 函数。 -shared 生成共享目标文件。通常用在建立共享库时。 -static 禁止使用共享连接。 -UMACRO 取消对 MACRO 宏的定义。 -w 不生成任何警告信息。 -Wall 生成所有警告信息 。 5.GDB 命令 gcc g o gets main.cgdb
11、 ./gets 进入 GDB 调试界面disassemble main 查看 main 函数的汇编p /x *0xbffff9b8 查看内存 0xbffff9b8 的内容info registers 查看寄存器info break 查看断点列表 info files 显示被调试文件的详细信息。 info func 显示所有的函数名称。 info local 显示当函数中的局部变量信息。 info prog 显示被调试程序的执行状态。 info var 显示所有的全局和静态变量名称。b *0x804850d 设置断点,多用来设置汇编代码的调试 delete breakpoint 1 该命令将会删
12、除编号 1 的断点,如不带编号参数,将删除所有的断点p /x $eax 查看寄存器内容$符号,另外还有 $pc : 程序计数器$fp : 帧指针(当前堆栈帧)$sp : 栈指针$ps : 处理器状态next 不进入的单步执行step 进入的单步执行backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where)breakpoint 在程序中设置一个断点cd 改变当前工作目录clear 删除刚才停止处的断点commands 命中断点时,列出将要执行的命令continue 从断点开始继续执行delete 删除一个断点或监测点;也可与其他命令一起使用display 程序停
13、止时显示变量和表达时down 下移栈帧,使得另一个函数成为当前函数frame 选择下一条 continue 命令的帧info 显示与该程序有关的各种信息jump 在源程序中的另一点开始运行kill 异常终止在 gdb 控制下运行的程序list 列出相应于正在执行的程序的原文件内容next 执行下一个源程序行,从而执行其整体中的一个函数print 显示变量或表达式的值pwd 显示当前工作目录pype 显示一个数据结构(如一个结构或 C+类)的内容quit 退出 gdbreverse-search 在源文件中反向搜索正规表达式run 执行该程序search 在源文件中搜索正规表达式set variable 给变量赋值signal 将一个信号发送到正在运行的进程step 执行下一个源程序行,必要时进入下一个函数undisplay display 命令的反命令,不要显示表达式until 结束当前循环up 上移栈帧,使另一函数成为当前函数watch 在程序中设置一个监测点(即数据断点)whatis 显示变量或函数类型