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

linux動態庫調用動態庫

發布時間: 2022-06-22 04:56:25

1. 如何讓自己的動態鏈接庫文件能夠在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重啟之後,該環境變數會失效;
這種方式更適合自動化的測試的需要。

2. linux調用動態庫的函數性能低

在對共享庫的調用是通過過程鏈接表(PLT)中的一個條目間接完成的。
最初,PLT中的所有條目都指向ld.so。在第一次調用函數時,ld.so查找符號的實際地址,更新PLT中的條目,並跳轉到函數。這是「懶惰」符號解析。您可以設置LD_BIND_NOW環境變數來更改此行為。除此之外,試一下不用DLL直接把函數卸載程序里的運行速度,如果仍然慢,那就是演算法的問題。

3. go怎麼在linux下調用動態庫

// script.go

package script

// 1
//extern initDll
func c_initDll(string, string)

//extern runDll
func c_runDll(string, map[string]interface{}) string

var dataMap map[string]interface{} // 2

func Init(fileName string, funcName string) {
dataMap = make(map[string]interface{})

return c_initDll(fileName, funcName)
}

func Run(buf []byte) string {
str := string(buf)

retStr := c_runDll(str, dataMap)

return retStr
}

4. linux對動態庫函數的調用太慢

動態庫函數在載入程序時,資料庫將被載入。但是,動態載入程序鏈接器將符號解析推遲到函數調用時間。在對共享庫的調用是通過過程鏈接表(PLT)中的一個條目間接完成的。最初,PLT中的所有條目都指向ld.so。在第一次調用函數時,ld.so查找符號的實際地址,更新PLT中的條目,並跳轉到函數。這是「懶惰」符號解析。您可以設置LD_BIND_NOW環境變數來更改此行為。除此之外,試一下不用DLL直接把函數卸載程序里的運行速度,如果仍然慢,那就是演算法的問題。

5. linux c編程調用系統的動態庫時,要使用dlopen等函數嗎

linux調用庫的方式有三種:
1.靜態鏈接庫
2.動態鏈接庫
3.動態載入庫
其中1,2都是在編程時直接調用,在鏈接時加參數-l進行鏈接
第三種需要在編程時使用dlopen等函數來獲取庫裡面函數的定義,然後進行調用.
不過對於沒有提供頭文件的動態庫,只能dlopen等函數來調用

6. linux調用動態庫彈出界面

您想問的是動態庫的顯式調用吧。
首先打開一個新庫,並把它裝入內存。
dlopen在dlfcn.h中定義,並在dl庫中實現。
當庫被裝入後,可以把dlopen返回的句柄作為給dlsym的第一個參數,以獲得符號在庫中的地址。

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

8. 如何判斷linux 動態庫調用

創建靜態庫:
ar -rcs test.a *.o
查看靜態庫:
ar -tv test.a
解壓靜態庫:
ar -x test.a

查看程序依賴的動態庫:
readelf -a xxx|grep library
如:可以看到,下面的交叉程序hello執行依賴於如下兩個動態庫。
rebi@ubuntu:~/test$ arm-none-linux-gnueabi-readelf -a hello|grep "library"
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
rebi@ubuntu:~/test$

或者:readelf -l hello 即可。

nm xxx 查看符號
其中,T表示代碼段,U表示在其它地方定義,所以需要確保必須在某個.o或庫里被定義過。

9. Linux下的靜態庫和動態庫

linux下的靜態庫和動態庫1.製作自己的動態庫和靜態庫linux下動態庫以.so結尾,靜態庫以.a結尾,它們都以lib開頭,比如一個庫名為net,那麼它的全名應該是libnet.so或者libnet.a。我們有兩個文件,hello.c和test.c,下面是兩個文件的內容//hello.c
www.shiwu.com
#include
<stdio.h>void
my_lib_func(){printf(Library
routine
called/r/n);}//test.c#include
<stdio.h>
www.shiwu.com
int
main(){my_lib_func();return
1;}test.c調用了hello.c的方法,我們把hello.c封裝成庫文件。無論是靜態庫還是動態庫,都是由.o文件組成,我們先把gcc
-c
hello.c生成.o文件製作靜態庫ar
crv
libmyhello.a
hello.o,ar是生成靜態庫的命令,libmyhello.a是我的靜態庫名。下一步就是在我的程序中使用靜態庫
可以看到已經有了Library
routine
called的結果,說明調用成功了。下面我們刪除libmyhello.a,看看程序是否還是運行正常
我們發現程序依然運行正常,說明靜態庫已經連接進入我們的程序中製作動態庫
www.shiwu.com
我們看見動態庫libmyhello.so已經生成,下面繼續使用
找不到庫文件,這個時候我們把so文件拷貝到/usr/lib下面
運行成功2.動態庫和靜態庫同時存在的調用規則我們可以發現,不論是動態庫還是靜態庫,程序編譯連接的時候都是加的參數-l,那麼當他們同時存在的時候,程序會選擇動態庫還是靜態庫呢。我們做個嘗試。
我們同時存在libmyhello.a和libmyhello.so,我們發現運行的時候,出現找不到動態庫的錯誤,由此,我們可以得出結論,同時存在動態庫和靜態庫的時候,gcc會優先選擇動態庫作者
梨樹陽光

熱點內容
用哪個軟體配置華為企業路由器 發布:2024-05-09 04:23:58 瀏覽:520
簡易腳本 發布:2024-05-09 04:17:30 瀏覽:801
返校vlog腳本 發布:2024-05-09 04:15:53 瀏覽:618
vps雲伺服器免費租用 發布:2024-05-09 04:10:42 瀏覽:208
空調壓縮機排量 發布:2024-05-09 04:08:42 瀏覽:539
android使用靜態庫 發布:2024-05-09 04:05:40 瀏覽:213
原生安卓開機動畫在哪裡 發布:2024-05-09 03:52:19 瀏覽:394
微信收藏在哪個文件夾 發布:2024-05-09 03:47:03 瀏覽:826
ftp遠程登錄 發布:2024-05-09 03:44:40 瀏覽:227
linuxoracle配置環境變數配置 發布:2024-05-09 03:44:38 瀏覽:499