當前位置:首頁 » 操作系統 » linux連接動態庫

linux連接動態庫

發布時間: 2022-04-23 08:20:04

⑴ 如何讓自己的動態鏈接庫文件能夠在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下連接動態庫問題

gcc編譯時,當使用動態庫編譯可以按照幾種寫法
1.gcc test.c ./libSDL2-2.so
2.gcc test.c -lSDL2-2
3.gcc test.c -L/home/test -lSDL2-2
一般的編譯參數都是按照2或3去寫
2寫法的含義是從/lib或者/usr/lib目錄下尋找名稱為SDL2-2的庫,即尋找/lib/libSDL2-2.so或者/usr/lib/libSDL2-2.so文件進行鏈接,當然如果沒有動態庫就會去找靜態庫,再沒有應該就會在編譯時報錯
3寫法的含義是從-L參數首先從指定的目錄中尋找需要鏈接的庫文件,隨後再去尋找系統文件夾中是否存在需要的庫
1寫法的含義是將當前目錄下的./libSDL2-2.so.0文件鏈接進最終文件,因此執行readelf -a a.out後在動態庫部分所看到的路徑就是./libSDL2-2.so.0,進而在執行文件時僅會從當前目錄下尋找libSDL2-2.so.0文件,當執行文件時所在的目錄下沒有該文件時就會出現找不到庫文件的操作

你第二次操作時,因為function.so庫文件與a.out文件在同一個目錄,同時也是在該目錄下執行的ldd操作及運行a.out,a.out在載入動態庫時從當前目錄下找到了所需要的庫文件,此時能夠執行成功(ldd命令實質是一個腳本,通過設置環境變數運行動態庫鏈接器來輸出所有待鏈接的動態庫)。
你可以試試將a.out拷貝至其他目錄再次運行,將出現和第一次操作時一樣的現象,找不到function.so文件。

具體的解決方法就是修改編譯參數,將./libSDL2-2.so.0修改為-lSDL2-2並將libSDL2-2.so.0文件拷貝至/usr/lib目錄下,並且可能因為沒有修改鏈接器的緩存文件(將可能找不到帶版本號後綴的動態庫),需要在/usr/lib目錄下建立一個文件連接(ln -s libSDL2-2.so.0 libSDL2-2.so)或者直接修改名稱為libSDL2-2.so

⑶ linux 編譯怎麼連接動態庫

Linux的動態庫文件是以lib字樣開頭的.so文件,編譯鏈接動態庫有兩個要點:一個是需要用-L選項指定動態庫的搜索路徑,這個搜索路徑是需要連接的so文件的大致路徑,比如/usr/openssl/lib;另外還需要用-l(這個是小寫的L)選項指定動態庫的名字,比如下面這條編譯命令:
gcc -o hello hello.c -L/usr/openssl/lib -lcrypto

⑷ 如何在 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:取消對先前設置的那些變數的跟蹤

⑸ linux為什麼一個動態庫鏈接另一個動態庫不行

因為動態庫實際上叫做動態函數庫,它是代碼庫,它不是一個可以獨立執行的東東,而是用來被調用的,因為沒有獨立執行能力,一個動態庫是無法用來連接其他的庫的。在Windows上的動態鏈接庫和Linux上的共享函數庫是一樣的,連接動態庫的都只能是獨立程序。

⑹ linux怎樣實現c語言動態庫與靜態庫的鏈接

Linux系統中靜態庫是.a文件,編譯鏈接.a文件只需要加上.a文件的完整的文件路徑就可以了,比如:
gcc
-o
hello
hello.c
/usr/lib/libm.a
Linux系統的動態庫是系統中的.so文件,編譯鏈接動態庫需要用-L參數指定動態庫的搜索路徑,還要用-l(這個是小寫的L)指定動態庫的名字,比如:
gcc
-o
hello
hello.c
-L/usr/openssl/lib
-lcrypto

⑺ Linux下的動態共享鏈接庫的優點有哪些

動態共享庫有以下的優點,使它在Linux開發中比靜態鏈接庫更加的流行。
(1) 節省內存
動態共享庫無論被多少應用程序使用,在內存中都只存在一個動態共享庫的副本,而不像靜態鏈接庫那樣,一個應用程序在運行中用到靜態鏈
接庫,就會有多個靜態鏈接庫的副本 。
(2) 節省磁碟
這和節省內存有點相似,同樣這也是由於靜態鏈接庫存在多個靜態鏈接庫的副本造成的。同樣的應用程序,使用動態共享庫編譯出的版本通常比使用靜態鏈接庫編譯出來的版本要小。因此,在嵌入式系統開發中使用動態共享庫也不節省空間,提供了一種很好的選擇。
(3) 便於軟體修復與升級
由於動態共享是獨立於應用程序存在的,因此,用新版本的動態共享庫替舊版本的工作將變得非常容易。如果使用靜態鏈接庫的話,假設在一個靜態庫中發現了一個
ug,那麼要修正這個
ug的話,就要重新編譯所有使用這個靜態庫的應用程序,使用這個靜態庫的應用程序有很多的話,可以想像工作量是有多大。
(4) 提高性能
與採用靜態鏈接庫臃腫的應用程序相比,採用動態共享庫的應用程序明顯「苗條」得多,這樣當操作系統載入應用程序時,是需要把應用程序
復制到內存中的,這樣的「苗條」的動態鏈接庫也就有了很大的優勢,同時提高了程序的性能。
當然,動態鏈接庫在有上述這些優勢的同時,也有以下的幾個劣勢。復雜性,兼容性,調試困難。但是它在Linux上使用頻率上仍然比靜態鏈接庫要高的多。應用的更加廣泛。

⑻ Linux中鏈接庫去掉後綴名,gcc如何區分鏈接的是動態庫還是靜態庫

判定規則如下:

如果庫目錄中存在兩種版本,gcc優先使用
動態鏈接庫


如果目錄只有靜態版本,則採用靜態鏈接庫;

帶有-static
參數時,gcc
將使用靜態鏈接庫,例如:gcc
foo.c
-static
-lpthread
-o
foo

⑼ 怎麼條用linux中動態鏈接庫裡面的函數

在dlopen()函數以指定模式打開指定的動態鏈接庫文件,並返回一個句柄給dlsym()的調用進程。使用dlclose()來卸載打開的庫。
當庫被裝入後,可以把
dlopen()
返回的句柄作為給
dlsym()
的第一個參數,以獲得符號在庫中的地址。使用這個地址,就可以獲得庫中特定函數的指針,並且調用裝載庫中的相應函數。

熱點內容
mac訪問windows共享 發布:2024-10-01 23:31:58 瀏覽:643
java培訓要學什麼 發布:2024-10-01 23:15:54 瀏覽:539
c語言編程學習寶典 發布:2024-10-01 22:35:08 瀏覽:346
無法打開腳本文件 發布:2024-10-01 22:14:51 瀏覽:110
javaxml格式字元串格式 發布:2024-10-01 21:54:03 瀏覽:657
為什麼安卓玩游戲都選驍龍 發布:2024-10-01 21:48:07 瀏覽:377
如何避免伺服器暴露ip 發布:2024-10-01 21:38:24 瀏覽:221
pythonrequestjson 發布:2024-10-01 21:37:37 瀏覽:858
珠海java 發布:2024-10-01 21:07:29 瀏覽:825
伺服器剩餘維護是什麼 發布:2024-10-01 21:03:46 瀏覽:547