Linux下C和C++开发基础

来源:互联网 发布:淘宝云客服招聘条件 编辑:程序博客网 时间:2024/04/28 15:22

n 编程语言:C C++
n
编译(compile):源文件(.c->目标文件(.o)
n
连接(link):目标文件(.o)->可执行文件
n
(library):静态连接库(.a)、动态连接库(.so)

Linux
下开发工具
n
编辑器:viemacs、窗口编辑器
n
编译器:GCC
n
调试器:GDB
n
可执行文件工具:Binutils
n
连接器:ld
n
汇编程序:as
n
库管理工具:ar
n
可执行文件符号管理:nm
n
显示可执行文件信息:objdump

简单程序示例(C语言)
n hello.c
/***************************

C代码

  1. i nclude <stdio.h>   
  2. int main(int argc,char **argv)   
  3. {   
  4. printf("HelloWorld!/n");   
  5. return 0;   
  6. }   
  7. /***************************   
  8. n编译方法:gcc –o hello hello.c   
  9. n运行方法:./hello   
  10. 简单程序示例(C++语言)  

i nclude <stdio.h>

int main(int argc,char **argv)

{

printf("HelloWorld!/n");

return 0;

}

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

n编译方法:gcc –o hello hello.c

n运行方法:./hello

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


n hello.cpp
/*******************************

C代码

  1. i nclude <iostream>   
  2. using namespace std;   
  3. int main(int argc,char **argv)   
  4. {   
  5. cout << "Hello World!“ << endl;   
  6. return 0;   
  7. }  

i nclude <iostream>

using namespace std;

int main(int argc,char **argv)

{

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

return 0;

}


/*******************************
n
编译方法:g++ –o hello hello.cpp
n
运行方法:./hello
GCC
编译器
n GNU
平台下主流编译器
n
目前最新稳定版4.0
n
官方网站:http://gcc.gnu.org
n
支持编译语言:CC++Objective-C
Objective-C++
JavaFortranAda
n
跨平台支持:支持几乎所有主流操作系统,如
Linux
UNIXWindows等。支持多种硬件平
台,如X86ARMPPCMIPS
n
交叉编译功能

编译相关文件路径
n
头文件
n
一般在/usr/include目录下
n
库文件
n
一般在/lib/usr/lib目录下
n
某些库在其他目录下,如X Window相关库一般在
/usr/X11R6/lib
目录下
n
编译器、连接器核心文件
n
一般在/usr/lib/gcc-lib/<target>/<version>目录下

Linux
下函数库
n
静态库(.a)和动态库(.so)
n
库命名:lib开头,库版本号
n
库链接
n
标准库:
n
动态加载库:ld-linux.so(/lib)
n
标准C库:libc.so(/lib)
n
标准C++库:libstdc++.so(/usr/lib)
n
数学库:libm.so(/lib)

GCC
使用用法
n
基本用法:
n gcc [options] file…
n
示例:gcc –o hello hello.c,编译hello.c为可执行文件
hello(
自动连接标准Clibc.so)
n
示例:gcc –o hello hello.c –lm,编译hello.c为可执行
文件hello,连接数学库libm
n
示例:g++ -o hello hello.cpp,编译hello.cpp为可执行
文件hello,自动连接标准C++libstdc++.so

GCC
常用选项
-v
:显示gcc版本信息及其相关信息
n
示例:gcc -v
n
可用于查看gcc核心文件信息及其编译配置选项
n -o
:生成可执行文件名
n
示例:gcc -o hello hello.c
n -c
:仅编译成中间目标文件(.o),不连接
n
示例:gcc -c hello.c,将生成hello.o
n -S
:由源程序生成汇编文件(.s)
n
示例:gcc -S hello.c,将生成hello.s
-E
:对源程序仅进行预处理,输出到标准输出上(可
用于分析预处理如define的问题)
n
示例:gcc -E hello.c> hellop.c
n -I
:指定头文件所在路径
n
示例:gcc -Iinclude -o hello hello.c
n -L
:指定库文件所在路径
n
示例:gcc –o hello hello.c -Llib -ltest
n -l
:指定连接的库文件
n
示例:同上
n -D
:定义宏
n
示例:gcc -D DEBUG=3 -o hello hello.c
-On
:代码优化选项,以产生更小和更快的目标代码,
n
表示优化级别,如-O1,-O2,-O3
n
示例:gcc -O2 -o hello hello.c
n -m<arch>
:针对特定处理器的优化,如-m386-m586
n
示例:gcc -m586 -o hello hello.c
n -g
:产生调试代码,用于gdb调试工具
n
示例:gcc -g -o hello hello.c
n -pg
:产生用于性能测试的附加信息,供gprof程序使用
n
示例:gcc -pg -o hello hello.c
n -Wall
:显示所有警告信息
n
示例:gcc -Wall -o hello hello.c




GNU
调试工具gdb
n
基本功能:
n
设置断点,暂停程序执行
n
监视运行状态下变量值
n
单步执行代码
n
汇编、反汇编
n
调试信息
n
源程序编译时加上-g选项,保证目标程序内含调试
信息,方便gdb调试时显示代码行、变量名等。


GDB
调试示例程序test.c

C代码

  1. i nclude <stdio.h>   
  2. int main()   
  3. {   
  4. int i,j;   
  5. j=0;   
  6. for(i=0;i<10;i++)   
  7. {   
  8. j+=2;   
  9. printf(“j=%d/n”,j);   
  10. }   
  11. }  

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调试命令
n
编译:gcc -g -o test test.c
n
运行gdbgdb test
n gdb
命令:
n help
:可查看gdb命令帮助
n gdb
命令可采用缩写,如list可缩写为l
n
列出源文件:list
n
设置断点:break
n
示例:break 6,在第6行设置断点
n
示例:break <filename>:<linenum>,在特定源文件的特定行设置断点
n
示例:break <>,在函数上设置断点
n
示例:break *<address>,在特定地址上设置断点
n
运行:run,在断点处程序暂停

GDB
调试命令
n
打印变量值:printprintf
n
示例:print i,打印变量i的值
n
示例:print i=10,将变量i赋值为10
n
示例:printf “0x%x/n”,j+20,按格式打印变量值
n
设置表达式观察点:awatchwatch
n
功能:awatch当变量被读写时暂停程序运行,watch当变量发生改变时暂停程序运行
n
示例:awatch j,当j发生改变时暂停运行,显示原值和新值;j被读时显示当前值
n
继续运行:continue
n
查看当前断点:info break
n
清除断点:clear
n
示例:clear 6,清除第6行设置的断点
n
删除断点:delete
n
示例:delete 2,删除编号为2的断点
n
屏蔽断点:disable
n
示例:disable 2,暂时使编号为2的断点失效
n
激活断点:enable
n
示例:enable 2,重新激活编号为2的断点
n
条件断点:
n
示例:break 8 if j==8,每执行到第8行检测j的值,如果j=8则程序暂停
n
其他断点命令:
n ignore
:忽略断点特定次数
n tbreak
:设置临时断点,仅执行一次
n
单步运行:step,跟踪到函数内部
n
单步运行:next,不跟踪到函数内部
n
显示表达式值:display,每运行到断点均显示值
n
显示display的表达式:info display
n
删除display的表达式:delete display <编号>
n
设置变量值:set variable
n
示例:set variable i=8
n
打印当前堆栈信息:backtrace
n
设置运行时参数:set args
n
源程序编译时-l选项可自动连接相应动态库
n
查看目标文件使用的动态库ldd
n
示例:ldd hello
n
动态库路径
n
默认/lib/usr/lib
n
/etc/ld.so.conf指定
n ldconfig
程序根据/etc/ld.so.conf重建动态库cache
n ld-linux.so
动态库负责完成动态链接
n
环境变量LD_LIBRARY_PATH

n
全称:executable and linkable format
n
目标文件:可重定位文件(relocatable.o),可执行文件,静态库,动态库等
n ELF
文件组成
n
文件头ELF header
n
程序段,典型的段.text(代码段).bss(未初始化的数据段).data(初始化的数据段)
n
重定位和位置无关代码(PIC)

二进制文件工具binutils
n
用于查看和操作二进制文件
n
包含工具:
n
连接器:ld
n
汇编器:as
n
转换地址到源程序行:addr2line
n
建立、修改函数库:ar
n
列出目标文件的符号表:nm
n
目标文件转换和拷贝:objcopy
n
显示目标文件信息:objdump
n
删除目标文件中的符号表:strip
n
显示elf文件信息:readelf

二进制文件工具使用示例
n
查看目标文件基本信息
n
示例:readelf –h hello
n
查看目标文件中的符号
n
示例:nm hello
n
查看目标文件中的段信息
n
示例:objdump –h hello
n
反汇编目标文件
n
示例:objdump –d hello
n
删除目标文件中的符号,减小文件大小
n
示例:strip hello
n
显示可执行文件中的常量串
n
示例:strings hello

编程帮助
n man
:用于查看标准命令、系统调用和函数库等的用法
n
示例:man sleep(查看标准命令sleep)
n
示例:man 3 sleep(查看函数sleep的用法)
n Info
:查看命令用法,类似Web页面
n
示例:info gcc,查看gcc用法
n
示例:info libc,查看标准C函数

原创粉丝点击