精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

linux鏈接庫文件命令 linux如何鏈接靜態庫文件

如何在 Linux 下調試動態鏈接庫

大家都知道在 Linux 可以用 gdb 來調試應用程序,當然前提是用 gcc 編譯程序時要加上

創新互聯專注為客戶提供全方位的互聯網綜合服務,包含不限于成都網站建設、網站設計、南岳網絡推廣、小程序開發、南岳網絡營銷、南岳企業策劃、南岳品牌公關、搜索引擎seo、人物專訪、企業宣傳片、企業代運營等,從售前售中售后,我們都將竭誠為您服務,您的肯定,是我們最大的嘉獎;創新互聯為所有大學生創業者提供南岳建站搭建服務,24小時服務熱線:18982081108,官方網址:www.cdcxhl.com

-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問題,詳情請看

望采納


當前名稱:linux鏈接庫文件命令 linux如何鏈接靜態庫文件
本文路徑:http://m.jcarcd.cn/article/hjheos.html
主站蜘蛛池模板: 国产人成精品综 | 欧美一级成人观 | 91秦先生在线视频 | 日本免费在线 | 欧美亚洲精品在线 | 国产精品日韩精 | 精品中文字幕女同 | 97人人在线 | 日韩精品毛| 日韩逼穴美女区欧美 | 福利小视频在线观看 | 91丨露脸丨熟女 | 日本一区二在线播放 | 日本不卡高清视频v | 日韩精品欧美一区喷 | 国产日韩欧美第二页 | 狠狠丁香 | 国产在线精品9 | 91精选国产大片 | 国产精品自拍一区 | 午夜免费一级视频 | 国产欧美自拍视频 | 精品日韩欧美一区 | 国产精品极 | 国产日韩欧美在线 | 日本成年人视频网站 | 九九色综 | 欧洲1区2区3区 | 国内视频日韩顶级片 | 成人午夜影院网站 | 91国产爽黄 | 人妖视频日本一 | 日韩女优一区视频 | 漂亮大学 | 精品日韩国产 | 国产精品119 | 91午夜福利区 | 国产一区二区三区不 | 中文字幕不卡 | 国产老妇伦国 | 国产尤物尤物在线看 |