Linux下C和C++开发基础

本文详细介绍了C语言的基本编程概念、Linux下的开发工具、GCC编译器的使用方法、静态库与动态库的管理、以及GCC的常用选项和GDB调试工具的应用。通过示例程序和详细步骤,帮助开发者快速掌握C语言开发和GCC编译的基本技能。

作者 阿江 日期 2009-3-23 4:57:00

基本编程概念

 编程语言:C 、C++

 编译(compile):源文件(.c)->目标文件(.o)

 连接(link):目标文件(.o)->可执行文件

 库(library):静态连接库(.a)、动态连接库(.so)

 

Linux下开发工具

编辑器:vi、emacs、窗口编辑器

编译器:GCC

调试器:GDB

可执行文件工具:Binutils

连接器:ld

汇编程序:as

库管理工具:ar

可执行文件符号管理:nm

显示可执行文件信息:objdump

 

简单程序示例(C语言):

 hello.c

/***************************

#i nclude <stdio.h>

int main(int argc,char **argv)

{

printf("HelloWorld!\n");

return 0;

}

/***************************

编译方法:gcc o hello hello.c

运行方法:./hello

简单程序示例(C++语言):

 hello.cpp

/*******************************

#i nclude <iostream>

using namespace std;

int main(int argc,char **argv)

{

cout << "Hello World!“ << endl;

return 0;

}

/*******************************

 编译方法:g++ o hello hello.cpp

 运行方法:./hello

GCC编译器 GNU平台下主流编译器

目前最新稳定版4.0

官方网站:http://gcc.gnu.org

支持编译语言:C、C++、Objective-C、Objective-C++、Java、Fortran、Ada

跨平台支持:支持几乎所有主流操作系统,如

Linux、UNIX、Windows等。支持多种硬件平台,如X86、ARM、PPC、MIPS等

交叉编译功能

 

编译相关文件路径

头文件

一般在/usr/include目录下

库文件

一般在/lib、/usr/lib目录下

某些库在其他目录下,如X Window相关库一般在/usr/X11R6/lib目录下

编译器、连接器核心文件

一般在/usr/lib/gcc-lib/<target>/<version>目录下

 

Linux下函数库

静态库(.a)和动态库(.so)

库命名:lib开头,库版本号

库链接

标准库:

动态加载库:ld-linux.so(/lib)

标准C库:libc.so(/lib)

标准C++库:libstdc++.so(/usr/lib)

数学库:libm.so(/lib)

 

GCC使用用法

基本用法:

 gcc [options] file

示例:gcc o hello hello.c,编译hello.c为可执行文件hello(自动连接标准C库libc.so)

示例:gcc o hello hello.c lm,编译hello.c为可执行文件hello,连接数学库libm

示例:g++ -o hello hello.cpp,编译hello.cpp为可执行文件hello,自动连接标准C++库libstdc++.so

 

GCC常用选项

-v :显示gcc版本信息及其相关信息

示例:gcc -v

可用于查看gcc核心文件信息及其编译配置选项

 -o:生成可执行文件名

示例:gcc -o hello hello.c

 -c:仅编译成中间目标文件(.o),不连接

示例:gcc -c hello.c,将生成hello.o

 -S:由源程序生成汇编文件(.s)

示例:gcc -S hello.c,将生成hello.s

-E:对源程序仅进行预处理,输出到标准输出上(可用于分析预处理如define的问题)

 示例:gcc -E hello.c> hellop.c

 -I:指定头文件所在路径

 示例:gcc -Iinclude -o hello hello.c

 -L:指定库文件所在路径

 示例:gcc o hello hello.c -Llib -ltest

 -l:指定连接的库文件

 示例:同上

 -D:定义宏

 示例:gcc -D DEBUG=3 -o hello hello.c

-On:代码优化选项,以产生更小和更快的目标代码,表示优化级别,如-O1,-O2,-O3

 示例:gcc -O2 -o hello hello.c

 -m<arch>:针对特定处理器的优化,如-m386,-m586等

 示例:gcc -m586 -o hello hello.c

 -g:产生调试代码,用于gdb调试工具

 示例:gcc -g -o hello hello.c

 -pg:产生用于性能测试的附加信息,供gprof程序使用

 示例:gcc -pg -o hello hello.c

 -Wall:显示所有警告信息

 示例:gcc -Wall -o hello hello.c

 

GNU调试工具gdb

基本功能:

设置断点,暂停程序执行

监视运行状态下变量值

单步执行代码

汇编、反汇编

调试信息

源程序编译时加上-g选项,保证目标程序内含调试信息,方便gdb调试时显示代码行、变量名等。

 

 

GDB调试示例程序test.c

#i nclude <stdio.h>

int main()

{

int i,j;

j=0;

for(i=0;i<10;i++)

{

j+=2;

printf(j=%d\n,j);

}

}

GDB调试命令

 编译:gcc -g -o test test.c

 运行gdb:gdb test

 gdb命令:

 help:可查看gdb命令帮助

 gdb命令可采用缩写,如list可缩写为l

 列出源文件:list

 设置断点:break

 示例:break 6,在第6行设置断点

 示例:break <filename>:<linenum>,在特定源文件的特定行设置断点

 示例:break <>,在函数上设置断点

 示例:break *<address>,在特定地址上设置断点

 运行:run,在断点处程序暂停

 

GDB调试命令

 打印变量值:print,printf

 示例:print i,打印变量i的值

 示例:print i=10,将变量i赋值为10

 示例:printf 0x%x\n,j+20,按格式打印变量值

 设置表达式观察点:awatch、watch

 功能:awatch当变量被读写时暂停程序运行,watch当变量发生改变时暂停程序运行

 示例:awatch j,当j发生改变时暂停运行,显示原值和新值;j被读时显示当前值

 继续运行:continue

查看当前断点:info break

清除断点:clear

示例:clear 6,清除第6行设置的断点

删除断点:delete

示例:delete 2,删除编号为2的断点

屏蔽断点:disable

示例:disable 2,暂时使编号为2的断点失效

激活断点:enable

示例:enable 2,重新激活编号为2的断点

条件断点:

示例:break 8 if j==8,每执行到第8行检测j的值,如果j=8则程序暂停

其他断点命令:

 ignore:忽略断点特定次数

 tbreak:设置临时断点,仅执行一次

单步运行:step,跟踪到函数内部

单步运行:next,不跟踪到函数内部

显示表达式值:display,每运行到断点均显示值

显示display的表达式:info display

删除display的表达式:delete display <编号>

设置变量值:set variable

示例:set variable i=8

打印当前堆栈信息:backtrace

设置运行时参数:set args

源程序编译时-l选项可自动连接相应动态库

查看目标文件使用的动态库ldd

示例:ldd hello

动态库路径

默认/lib,/usr/lib

由/etc/ld.so.conf指定

 ldconfig程序根据/etc/ld.so.conf重建动态库cache

 ld-linux.so动态库负责完成动态链接

环境变量LD_LIBRARY_PATH

 

全称:executable and linkable format

目标文件:可重定位文件(relocatable,.o),可执行文件,静态库,动态库等

 ELF文件组成

文件头ELF header

程序段,典型的段.text(代码段)、.bss(未初始化的数据段)、.data(初始化的数据段)

重定位和位置无关代码(PIC)

 

二进制文件工具binutils

 用于查看和操作二进制文件

 包含工具:

 连接器:ld

 汇编器:as

 转换地址到源程序行:addr2line

 建立、修改函数库:ar

 列出目标文件的符号表:nm

 目标文件转换和拷贝:objcopy

 显示目标文件信息:objdump

 删除目标文件中的符号表:strip

 显示elf文件信息:readelf

 

二进制文件工具使用示例

查看目标文件基本信息

示例:readelf h hello

查看目标文件中的符号

示例:nm hello

查看目标文件中的段信息

示例:objdump h hello

反汇编目标文件

示例:objdump d hello

删除目标文件中的符号,减小文件大小

示例:strip hello

显示可执行文件中的常量串

示例:strings hello

 

编程帮助

 man:用于查看标准命令、系统调用和函数库等的用法

示例:man sleep(查看标准命令sleep)

示例:man 3 sleep(查看函数sleep的用法)

 Info:查看命令用法,类似Web页面

示例:info gcc,查看gcc用法

示例:info libc,查看标准C函数


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值