导航:首页 > 操作系统 > linux使用动态链接库

linux使用动态链接库

发布时间:2022-09-25 12:30:44

㈠ 动态链接库是什么,为什么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 ing" 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 ing" 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:取消对先前设置的那些变量的跟踪

㈢ 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中动态链接库里面的函数

在dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程。使用dlclose()来卸载打开的库。
当库被装入后,可以把
dlopen()
返回的句柄作为给
dlsym()
的第一个参数,以获得符号在库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调用装载库中的相应函数。

㈤ 如何在linux下用matlab生成动态链接库

首先如何制作Linux下的so 文件

首先让我们来看一下,把库函数推迟到程序运行时期载入的好处:

1.可以实现进程之间的资源共享。

什么概念呢?就是说,某个程序的在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。这样的模式虽然会带来一些“动态链接”额外的开销,却大大的节省了系统的内存资源。C的标准库就是动态链接库,也就是说系统中所有运行的程序共享着同一个C标准库的代码段.

2.将一些程序升级变得简单。用户只需要升级动态链接库,而无需重新编译链接其他原有的代码就可以完成整个程序的升级。Windows 就是一个很好的例子。

3.甚至可以真正坐到链接载入完全由程序员在程序代码中控制。

程序员在编写程序的时候,可以明确的指明什么时候或者什么情况下,链接载入哪个动态链接库函数。你可以有一个相当大的软件,但每次运行的时候,由于不同的操作需求,只有一小部分程序被载入内存。所有的函数本着“有需求才调入”的原则,于是大大节省了系统资源。比如现在的软件通常都能打开若干种不同类型的文件,这些读写操作通常都用动态链接库来实现。在一次运行当中,一般只有一种类型的文件将会被打开。所以直到程序知道文件的类型以后再载入相应的读写函数,而不是一开始就将所有的读写函数都载入,然后才发觉在整个程序中根本没有用到它们

步骤:

首先建立一个函数文件fun.cpp 以及头文件 fun.h

[cpp]view plain

  • exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:~/你的库目录

  • (2)
  • 更改/etc/ld.so.conf,添加我们的库目录,然后执行ldconf

    需要root权限

    (3)加入/user/lib 或者/usr/lib64看你的机器位数,貌似拷贝的方法最凑效了,其他方法有时候行不通

    ㈥ 如何用qt在linux中编写并使用动态链接库

    先写好实现动态链接库的libmy.cpp文件和libmy.h文件,如下:

    // libmy.cpp

    #include"libmy.h"

    #include<iostream>

    using namespace std;
    MyLib::MyLib()
    {
    }

    MyLib::~MyLib()
    {
    }

    void MyLib::hello()
    {
    cout << "hello world~!" << endl;
    }

    // libmy.h文件

    #ifndef LIBMY_H
    #define LIBMY_H
    class MyLib

    {
    public:
    MyLib();
    ~MyLib();
    void hello();
    };
    #endif /*LIBMY_H*/

    然后写好pro文件,如下:

    TEMPLATE = lib
    TARGET =DllTest

    HEADERS += libmy.h
    SOURCES += libmy.cpp

    保存关闭,文件名命名为MyDll.pro
    在Shell里执行qmake MyDll.pro,在没有错误的情况下,然后执行make ,可以看到生成了几个后缀名为so的文件,如下图:

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

    你需要debug版本的库文件,一个库发布往往有3种版本,一个是运行期的库,一个是开发版的,还有一个是调试版的。 以ubuntu环境下,libc为例,你可以sudo apt-get install libc-dbg来安装调试库。

    ㈧ 如何让自己的动态链接库文件能够在linux下被调用

    如何让自己的动态链接库文件能够在linux下被调用

    VxWorks
    安装的DVD有很多自己的动态链接库文件,在启动一些服务的时候需要调用这些动态链接库文件,否则不能启动一些功能,report:找不到相关的库文件。

    解决的方法可以有多种:

    1.
    直接创建软连接的方式,将某动态链接库文件链接到
    /lib
    或者/usr/lib
    下。

    ln
    -s
    `pwd`/xxx.so
    /lib/xxx.so

    这种方式适合少数固定不变动态链接库文件的调用,但如果文件很多,或者这些文件也是经常存在更新的,这么多比较繁琐。


    2.
    如果直接把动态链接库文件所在的路径直接加到系统查找库的路径下,这里有两种方式:

    1)
    更改/etc/ld.so.conf,
    加入自己的动态链接库路径,好像需要更新/etc/ld.so.cache;
    该方法应该可用,没有尝试过。

    2)
    更改环境变量LD_LIBRARY_PATH,把自己的动态链接库路径,加入到该环境变量中。
    export
    LD_LIBRARY_PATH=/Jenkins/workspace/Mefa_Nightly_regression_Job02/MAIN/mefa_platform/logs_1st_round/mefaImage/simulatorTools:$LD_LIBRARY_PATH
    在该环境变量中的动态链接库文件会比系统中/lib
    或者
    /usr/lib
    更早调用。

    linux重启之后,该环境变量会失效;
    这种方式更适合自动化的测试的需要。

    ㈨ 怎么条用linux中动态链接库里面的函数

    在dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程。使用dlclose()来卸载打开的库。
    当库被装入后,可以把 dlopen() 返回的句柄作为给 dlsym() 的第一个参数,以获得符号在库中的地址。使用这个地址,就可以获得库中特定函数的指针,并且调用装载库中的相应函数。

    阅读全文

    与linux使用动态链接库相关的资料

    热点内容
    常用cmd网络命令 浏览:676
    hashmap7源码分析 浏览:896
    搜索引擎原理技术与系统pdf 浏览:359
    运动估计算法python 浏览:858
    java正则1 浏览:536
    redhatlinux最新 浏览:177
    python字典编程词汇 浏览:144
    微信和服务器如何通讯 浏览:10
    百家号服务器配置有什么用 浏览:598
    怎么为电脑加密 浏览:58
    服务器出现差错是什么意思 浏览:616
    苹果app移到商店里怎么删掉 浏览:254
    phpjsphtml 浏览:63
    吃鸡手机国际服服务器超时怎么办 浏览:68
    努比亚Z5无命令 浏览:642
    展示网站云服务器 浏览:872
    代码混淆器php 浏览:367
    贝恩pdf 浏览:209
    丙烯pdf 浏览:368
    云服务器华硕 浏览:713