红联Linux门户
Linux帮助

Linux编程 C/C++

发布时间:2007-03-16 10:18:51来源:红联作者:trangod
1.IDE的选择

eclipse+CDT, eclipse是一个开源项目,在http://www.eclipse.org,CDT是这个平台的C/C++插件.一定要在linux下用 unzip等来解压,很简单: unzip packname.zip
安装JDK,完毕后编辑/etc/profile文件,在最后加上
export JAVA_HOME=/usr/java/j2sdk1.4.2_04
export PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=.:/usr/java/j2sdk1.4.2_04/lib/tools.jar:$CLASSPATH
export CLASSPATH

2.gcc与gdb

要查看GCC手册,在终端下输入 man gcc 就行了。想退出手册,输入q。GCC也有支持C++的版本,叫g++。

GDB的使用


先编译一个带调试信息的程序 gcc -g os.c -o os

现在生成的带调试信息的可执行文件就是os.

接下来在终端下输入gdb,马上会出现一大堆版权信息和版本信息。最后是一个 (gdb)

这就是GDB的命令提示符,在这后面可以直接输入命令,退出是q。

首先我们可以设置gdb的屏幕大小。键入: (gdb)set width 70 就是把标准屏幕设为70列。

然后让我们来设置断点。设置方法很简单:break或简单打b后面加行号或函数名

比如我们可以在main 函数上设断点: (gdb)break main 或(gdb)b main

系统提示:Breakpoint 1 at 0x8049552: file os.c, line 455.

然后我们可以运行这个程序, 当程序运行到main函数时程序就会停止返回到gdb的

提示符下。运行的命令是run或r(gdb中有不少alias,可以看一下help,在gdb下打help)

run 后面可以跟参数,就是为程序指定命令行参数。

比如r abcd,则程序就会abcd以作为参数。(这里要说明的是可以用set args来指定参

数)。打入r或run后,程序就开始运行直到进入main的入口停止,显示:

Starting program: <路径>/os



Breakpoint 1, main () at os.c:455

455 Initial();

这里455 Initial();是将要执行的命令或函数。

gdb提供两种方式:1.单步进入,step into就是跟踪到函数内啦。命令是step或s

2.单步,next,就是简单的单步,不会进入函数。命令是next或n

这两个命令还有别的用法

可以用l/list命令来显示原代码。

(gdb) b AlarmMessage

Breakpoint 2 at 0x8048ee3: file os.c, line 259.

(gdb)c

c或continue命令让我们继续被中断的程序。 显示:

Continuing.

Use Control-C to halt



bt或backtrace命令可以显示栈中的内容。

(gdb) bt

检查表达式的值的命令是p或print

格式是p <表达式>

(gdb)l 1

还记得l的作用吗?l或list显示原代码符号,l或list加<行号>就显示从<行号>开始的原代码。

3.epoll的安装和调试

http://www.xmailserver.org/linux-patches/nio-improve.html

从网上下载了一个 epoll-lib-0.11.tar.gz ,把它放到已经升级内核到2.6的Redhat9机器,解开。然后进去make,发现没有mkdep……也懒得管了,直接来一个:make lib/libepoll.a

跳过了mkdep这一步,但还是出错:

./src/epoll.c: In function `epoll_create':

./src/epoll.c:28: error: `__NR_epoll_create' undeclared (first use in this function)

./src/epoll.c:28: error: (Each undeclared identifier is reported only once

./src/epoll.c:28: error: for each function it appears in.)

./src/epoll.c: In function `epoll_ctl':

./src/epoll.c:30: error: `__NR_epoll_ctl' undeclared (first use in this function)

./src/epoll.c: In function `epoll_wait':

./src/epoll.c:32: error: `__NR_epoll_wait' undeclared (first use in this function)

百思不得其解……向东博士提说:把内核的源代码ln 到/usr/src/linux目录下。这才恍然大悟。于是:

ln -s /usr/src/linux-2.6.14.2 /usr/src/linux

哈哈,这下编译通过了。赶快make install(其实我是自己手工把.h和.lib复制到相应目录,那些man的东西全部都不管了)。

然后就开始编译自己的代码了。谁知道到了链接这一步,又出问题了:

/usr/lib/gcc/i686-pc-linux-gnu/4.0.2/../../../../i686-pc-linux-gnu/bin/ld: cannot find /lib/libpthread.so.0

这是晕死,还以为是自己的gcc装错了,于是重新装了一次gcc。但还是出现同样的问题。

又是向东博士提示:

ln /lib/i686/libpthread-0.10.so /lib/libpthread.so.0

链接也都通过了。

也未免高兴得太早,轮到运行出错了:

/lib/libgcc_s.so.1: version `GCC_3.3' not found (required by /usr/lib/libstdc++.so.6)

……这次不用别人提示了,马上到处找找哪里还有libgcc_s.so.1。于是我把/home/cyt/gcc-4.0.2/objdir/gcc/libgcc_s.so.1复制到了/lib下面。(其实就是我make gcc的那个目录下面找到的libgcc_s.so.1,其它地方都有的,不过我也懒得找了)。

终于程序跑起来了……
文章评论

共有 2 条评论

  1. nothingbutme18 于 2007-03-16 11:47:43发表:

    其实发一个帖子不是想象的那么容易
    当然剪刀糨糊的除外
    看着难就不妨做做
    可能感觉会好些

  2. Linux85fan 于 2007-03-16 10:56:15发表:

    看起来很难啊。