大家都知道在 Linux 可以用 gdb 来调试应用程序,当然前提是用 gcc 编译程序时要加上
-g 参数。
我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题。
首先,假设我们准备这样的一个动态链接库:
QUOTE :
库名称是: ggg
动态链接库文件名是: libggg. so
头文件是: get. h
提供这样两个函数调用接口:
int get ();
int set (int a );
要生成这样一个动态链接库,我们首先编写这样一个头文件:
int get ();
int set (int a );
然后准备这样一个生成动态链接库的源文件:
#include <stdio.h >
#include "get.h"
static int x=0 ;
int get ()
{
printf ("get x=%d\n", x );
return x ;
}
int set (int a )
{
printf ("set a=%d\n", a );
x = a ;
return x ;
}
然后我们用 GNU 的 C/C++ 编译器来生成动态链接库,编译命令如下:
QUOTE :
g++ get.cpp -shared -g -DDEBUG -o libggg. so
这样我们就准备好了动态链接库了,下面我们编写一个应用程序来调用此动态链接库,源代码如下:
#include <stdio.h >
#include "get.h"
int main (int argc, char** argv )
{
int a = 100 ;
int b = get ();
int c = set (a );
int d = get ();
printf ("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d );
return 0 ;
}
编译此程序用下列命令,如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录,比如 /lib 或 /usr/lib 之类的,就用下面这条命令:
QUOTE :
g++ pk.cpp -o app -Wall -g - lggg
否则就用下面这条命令:
QUOTE :
g++ pk.cpp -o app -Wall -g -lggg -L`pwd `