導航:首頁 > 操作系統 > 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使用動態鏈接庫相關的資料

    熱點內容
    日本經典高分電影 瀏覽:627
    動物真人版電影鳳凰定製 瀏覽:360
    海客雲伺服器一個月怎麼算的 瀏覽:161
    黑道小說主角外號瘋子 瀏覽:309
    書包cc網電子書txt免費下載 瀏覽:354
    帶一點黃的小說 瀏覽:257
    法國倫理電影小僕人 瀏覽:187
    印度搶打火機的電影叫什麼 瀏覽:291
    求在線觀看資源2020年 瀏覽:946
    聚優電影可以在哪些影院使用 瀏覽:124
    阿里雲伺服器怎麼安裝bt面板 瀏覽:630
    霍爾瓦特大街小說 瀏覽:857
    可以看的網址大全 瀏覽:416
    一個名叫尼克和保姆的電影 瀏覽:613
    電影里有戒尺的 瀏覽:845
    徐英演的哪些大尺度電影 瀏覽:412
    鬼片英文版 瀏覽:600
    《前度2》完整未刪減 瀏覽:851
    大陸類似春的森林電影 瀏覽:526
    1受多攻獸世 瀏覽:849