• 注册
当前位置:1313e > 默认分类 >正文

linux链接库文件命令 linux如何链接静态库文件

如何在 Linux 下调试动态链接库

大家都知道在 Linux 可以用 gdb 来调试应用程序,当然前提是用 gcc 编译程序时要加上

-g 参数。

我这篇文章里将讨论一下用 gdb 来调试动态链接库的问题。

首先,假设我们准备这样的一个动态链接库:

QUOTE:

库名称是: ggg

动态链接库文件名是: libggg.so

头文件是: get.h

提供这样两个函数调用接口:

int get ();

int set (int a);

要生成这样一个动态链接库,我们首先编写这样一个头文件:

[Copy to clipboard]

CODE:

/************关于本文档********************************************

*filename: get.h

*purpose: 一个动态链接库头文件示例

*tided by: zhoulifa() 周立发 ()

Linux 爱好者 Linux 知识传播者 SOHO 族 开发者 最擅长 C 语言

*date time: 2006-11-15 21:11:54

*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途

* 但请遵循 GPL

*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力

* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!

*感谢 提供原始代码,

我在他的基础上整理了此文

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

int get ();

int set (int a);

然后准备这样一个生成动态链接库的源文件:

[Copy to clipboard]

CODE:

/************关于本文档********************************************

*filename: get.cpp

*purpose: 一个动态链接库源文件示例

*tided by: zhoulifa() 周立发 ()

Linux 爱好者 Linux 知识传播者 SOHO 族 开发者 最擅长 C 语言

*date time:2006-11-15 21:11:54

*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途

* 但请遵循 GPL

*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力

* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!

*感谢 提供原始代码,

我在他的基础上整理了此文

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

#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

这样我们就准备好了动态链接库了,下面我们编写一个应用程序来调用此动态链接库,源代码如下:

[Copy to clipboard]

CODE:

/************关于本文档********************************************

*filename: pk.cpp

*purpose: 一个调用动态链接库的示例

*tided by: zhoulifa() 周立发 ()

Linux 爱好者 Linux 知识传播者 SOHO 族 开发者 最擅长 C 语言

*date time:2006-11-15 21:11:54

*Note: 任何人可以任意复制代码并运用这些文档,当然包括你的商业用途

* 但请遵循 GPL

*Hope:希望越来越多的人贡献自己的力量,为科学技术发展出力

* 科技站在巨人的肩膀上进步更快!感谢有开源前辈的贡献!

*感谢 提供原始代码,

我在他的基础上整理了此文

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

#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`

下面我们就开始调试上面命令生成的 app 程序吧。如果已经把上面生成的 libggg.so 放到了库文件搜索路径指定的文件目录,比如 /lib或 /usr/lib 之类的,调试就顺利完成,如下

QUOTE:

./app

GNU gdb 6.4-debian

Copyright 2005 Free Software Foundation,Inc.

GDB is free software, covered by the GNU

General Public License, and you are

welcome to change it and/or distribute

copies of it under certain conditions.

Type "show copying" to see theconditions.

There is absolutely no warranty for GDB.

Type "show warranty" for details.This GDB was configured as "i486-linux-

gnu"...Using host libthread_db library"/lib/tls/i686/cmov/libthread_db.so.1".

(gdb) b main /* 这是在程序的 main 处设置断点 */

Breakpoint 1 at 0x804853c: file pk.cpp,line 7.

(gdb) b set /* 这是在程序的 set 处设置断点 */

Function "set" not defined.

Make breakpoint pending on future shared

library load? (y or [n]) y /* 这里必须选择 y 调试程序才会跟踪到动态链接库内部去

*/Breakpoint 2 (set) pending.

(gdb) run /* 开始运行我们的程序,直到遇见断点时暂停 */

Starting program: /data/example/c/app

Breakpoint 3 at 0xb7f665f8: file get.cpp,line 11.

Pending breakpoint "set" resolved

Breakpoint 1, main (argc=1,argv=0xbf990504) at pk.cpp:7

7 int a = 100;

(gdb) n /* 继续执行程序的下一行代码

*/

8 int b = get ();

(gdb) n /* 程序执行到了我们断点所在的动态链接库了 */

get x=0

9 int c = set (a);(gdb) n

Breakpoint 3, set (a=100) at get.cpp:11

11 printf ("set a=%d\n", a);

(gdb) list /* 查看当前代码行周围的代码,证明我们已经跟踪到动态链接库的源代码里面了 */

6 printf ("get x=%d\n", x);

7 return x;

8 }

9 int set (int a)

10 {

11 printf ("set a=%d\n", a);

12 x = a;

13 return x;

14 }

(gdb) n

set a=100

12 x = a;(gdb) n

13 return x;(gdb) n

14 }

(gdb) n

main (argc=1, argv=0xbf990504) at

pk.cpp:10

10 int d = get ();

(gdb) n

get x=100

11 printf ("a=%d,b=%d,c=%

d,d=%d\n",a,b,c,d);

(gdb) n

a=100,b=0,c=100,d=100

12 return 0;

(gdb) c

Continuing.

Program exited normally.

(gdb) quit /* 程序顺利执行结束 */#

如果我们没有把动态链接库放到指定目录,比如/lib里面,调试就会失败,过程如下:

QUOTE:

# gdb ./app

GNU gdb 6.4-debian

Copyright 2005 Free Software Foundation,

Inc.

GDB is free software, covered by the GNU

General Public License, and you arewelcome to change it and/or distribute

copies of it under certain conditions.

Type "show copying" to see theconditions.

There is absolutely no warranty for GDB.

Type "show warranty" for details.

This GDB was configured as "i486-linux-

gnu"...Using host libthread_db library

"/lib/tls/i686/cmov/libthread_db.so.1".

(gdb) b main

Breakpoint 1 at 0x804853c: file pk.cpp,

line 7.

(gdb) b set

Function "set" not defined.

Make breakpoint pending on future shared

library load? (y or [n]) y

Breakpoint 2 (set) pending.

(gdb) run /* 虽然调试操作都一样,但程序执行失败 */

Starting program: /data/example/c/app

/data/example/c/app: error while loading

shared libraries: libggg.so: cannot open

shared object file: No such file or

directory

Program exited with code 0177.

(gdb) quit

#

本次实验的环境是:

CPU:AMD Athlon(tm) 64 Processor 3000+

内存:512M

OS:Ubuntu GNU/Linux 6.06 dapper LTS

gcc:gcc 版本 4.0.3 (Ubuntu 4.0.3-1ubuntu5)

break(b) 行号:在某一行设置断点

break 函数名:在某个函数开头设置断点

break...if...:设置条件断点

continue(或c):从当前位置开始连续而非单步执行程序

delete breakpoints:删除所有断点

delete breakpoints n:删除序号为n的断点

disable breakpoints:禁用断点

enable breakpoints:启用断点

info(或i) breakpoints:参看当前设置了哪些断点

run(或r):从开始连续而非单步执行程序

display 变量名:跟踪查看一个变量,每次停下来都显示它的值

undisplay:取消对先前设置的那些变量的跟踪

linux 编译怎么连接动态库

Linux的动态库文件是以lib字样开头的.so文件,编译链接动态库有两个要点:一个是需要用-L选项指定动态库的搜索路径,这个搜索路径是需要连接的so文件的大致路径,比如/usr/openssl/lib;另外还需要用-l(这个是小写的L)选项指定动态库的名字,比如下面这条编译命令:

gcc -o hello hello.c -L/usr/openssl/lib -lcrypto

matlab在linux下生成的动态链接库怎么用

动态库的生成

1首先生成目标文件,但是此时要加编译器选项-fpic和链接器选项-shared,

gcc -fpic -c add.c

gcc -fpic -c sub.c

生成中间文件add.o和sub.o

2其次生成动态库

gcc -shared –o libtiger.so add.o sub.o

生成动态库libtiger.so,libtiger.so就是我们生成的目标动态库。我们以后使用动态库和main.c程序生成可执行程序

说明:

以上两部也可以合成一步搞定:

gcc -fpic -shared add.c sub.c -o libtiger.so

2.使用动态链接库

在编译程序时,使用动态链接库和静态库是一致的,使用”-l库名”的方式,在生成可执行文件的时候会链接库文件。

1使用命令:

gcc -o main main.c -L ./ -ltiger

2-L指定动态链接库的路劲,-ldtiger链接库函数tiger。-ltiger是动态库的调用规则。Linux系统下的动态库命名方式是lib*.so,而在链接时表示位-l*,*是自己命名的库名。

3但是程序会提示如下错误

error while loading shared libraries: libtiger.so: cannot open shared object file: No such file or direct

这是因为程序运行时没有找到动态链接库造成的。程序编译时链接动态库和运行时使用动态链接库的概念是不同的,在运行时,程序链接的动态链接库需要在系统目录下才行。

4使用以下方法可以解决此问题

a. 在linux下最方便的解决方案是拷贝libtiger.so到绝对目录 /lib 下(但是,要是超级用户才可以,因此要使用sudo哦,亲)。就可以生成可执行程序了

b.第二种方法是:将动态链接库的目录放到程序搜索路径中,可以将库的路径加到环境变量LD_LIBRARY_PATH中实现:

export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

linux c下怎么链接数据库

开启MySQL服务后,使用MySQL命令可以登录。一般使用mysql -uroot -p即可。如果数据库不是本机,则需要加参数,常用参数如下:

1,-h,指定ip地址,默认为localhost

2,-u,指定用户名。

3,-p,指定密码,密码可以接在-p后面输入mysql -uroot -p123456。也也可以mysql -uroot -p回车等提示输入密码时输入,这样输入密码没有回显。

需要解决更多linux问题,详情请看

望采纳

本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 162202241@qq.com 举报,一经查实,本站将立刻删除。

最新评论

欢迎您发表评论:

请登录之后再进行评论

登录