亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標題: [Linux初級]Linux下動態(tài)庫的生成及鏈接方法 [打印本頁]

作者: Godbach    時間: 2007-07-25 15:36
標題: [Linux初級]Linux下動態(tài)庫的生成及鏈接方法
最近在看《C專家編程》,看到第5章-對鏈接的思考,正好作為參考,對Linux下動態(tài)庫的生成及鏈接方法作一下總結(jié)。

Linux下動態(tài)庫文件的擴展名為".so"(Shared Object)。按照約定,所有動態(tài)庫文件名的形式是libname.so(可能在名字中加入版本號)。這樣,線程函數(shù)庫被稱作libthread.so。靜態(tài)庫的文件名形式是libname.a。共享archive的文件名形式是libname.sa。共享archive只是一種過渡形式,幫助人們從靜態(tài)庫轉(zhuǎn)變到動態(tài)庫。

本文僅以簡單的例子介紹動態(tài)庫文件的生成和鏈接方法。
操作系統(tǒng):Debian/GNU Linux 2.6.21-2-686;
GCC版本:4.1.3

一、庫文件及測試文件代碼

庫文件及測試文件所在的目錄:/home/program/。

1.庫文件名:myfunction.c

/*Author: Godbach
  E-mail: nylzhaowei@163.com
*/


#include <stdio.h>
int
my_lib_function (void)
{
    printf ("Library routine called from libmyfunction.so!\n");
    return 0;
}


2.測試文件名:test.c


#include <stdio.h>
int main(void)
{
    my_lib_function();
    return 0;
}


二、動態(tài)庫的編譯方法

編譯庫文件myfunction.c:


debian:/home/program# gcc -shared -o libmyfunction.so myfunction.c


如果編譯成功,會在/home/program/下生成動態(tài)庫文件:libmyfunction.so。
這里有兩點需要說明:
1.對Linux操作,一般都推薦在普通用戶模式下,如果需要超級用戶的權(quán)限,則可以通過su root,輸入root用戶密碼切換。我是個人學習使用,同時又有很多的操作都要使用root用戶,因此就直接在root用戶下進行編譯。

2.編譯生成動態(tài)庫的命令為:gcc (-fpic) -shared -o libmyfunction.so myfunction.c
    -fpic 使輸出的對象模塊是按照可重定位地址方式生成的。
    -shared指定把對應(yīng)的源文件生成對應(yīng)的動態(tài)鏈接庫文件。

三、動態(tài)庫的測試方法

編譯測試文件test.c:

debian:/home/program# gcc -o test test.c /home/program/libmyfunction.so

成功編譯后,生成test文件,運行test:


debian:/home/program# ./test
Library routine called from libmyfunction.so!

其中,gcc -o test test.c /home/program/libmyfunction.so的最后一個參數(shù)指定所鏈接庫文件的絕對路徑。本例中庫文件的絕對路徑為:/home/program/libmyfunction.so。

當然,如果想從系統(tǒng)的庫文件路徑(通常系統(tǒng)函數(shù)庫的位于/usr/lib下)鏈接動態(tài)庫的話,可以先將生成的庫文件拷貝至/usr/lib/下,然后再鏈接:


debian:/home/program# cp libmyfunction.so /usr/lib/
debian:/home/program# gcc -o test test.c -lmyfunction
debian:/home/program# ./test

Library routine called from libmyfunction.so!

這里,對于鏈接的方法作一下解釋。對于gcc -o test test.c -lmyfunction中最后一個參數(shù)-lmyfunction,可見傳給C編譯器的命令行參數(shù)并未提到函數(shù)庫的完整路徑名,甚至沒有提到在函數(shù)庫目錄中該文件的完整名字!實際上,編譯器被告知根據(jù)選項-lmyfunction鏈接到相應(yīng)的函數(shù)庫(/usr/lib下),函數(shù)庫的名字是libmyfunction.so,也就是說,"lib"部分和文件的擴展名被省略了,但在前面加了一個"l"。

歡迎交流!
http://blog.chinaunix.net/u/33048/showart_346448.html
http://nylzhaowei.blog.163.com/blog/static/1430392200762532723686/
本文可以自由轉(zhuǎn)載,但請注明鏈接。

[ 本帖最后由 Godbach 于 2007-7-28 00:19 編輯 ]
作者: Godbach    時間: 2007-07-25 15:48
適合入門的朋友
作者: MMMIX    時間: 2007-07-25 16:33
原帖由 Godbach 于 2007-7-25 15:48 發(fā)表
適合入門的朋友

加個精華,鼓勵一把。
作者: Godbach    時間: 2007-07-25 17:36
多謝版主阿。以前寫一些文章都放在Blog上了,感覺還是發(fā)貼子比較好,可以和更多的網(wǎng)友交流。
作者: MMMIX    時間: 2007-07-25 17:50
原帖由 Godbach 于 2007-7-25 17:36 發(fā)表
多謝版主阿。以前寫一些文章都放在Blog上了,感覺還是發(fā)貼子比較好,可以和更多的網(wǎng)友交流。

對頭,你也可以兩邊都發(fā)
作者: Godbach    時間: 2007-07-25 20:18
呵呵,多謝版主提醒。想來接觸Linux也有兩年多了,到現(xiàn)在還沒有深入的學到什么的東西,只是總聽停留在安裝和試用不同版本的Linux還有Unix(FreeBSD和Solaris x86),真是慚愧!
作者: MMMIX    時間: 2007-07-25 21:31
原帖由 Godbach 于 2007-7-25 20:18 發(fā)表
呵呵,多謝版主提醒。想來接觸Linux也有兩年多了,到現(xiàn)在還沒有深入的學到什么的東西,只是總聽停留在安裝和試用不同版本的Linux還有Unix(FreeBSD和Solaris x86),真是慚愧!

泛雖然可以開闊眼界,但是只有泛還是不夠的,應(yīng)該盡早找準方向深入下去,讓泛和深兩者結(jié)合起來。
作者: Godbach    時間: 2007-07-26 07:58
是啊,最近在深入的學習Linux下的C編程,以及進一步的驅(qū)動程序的開發(fā)。希望也喜歡做底層程序的開發(fā)。
作者: happynew    時間: 2007-07-27 16:08
編譯庫文件myfunction.c:
這步哪里去了?
作者: Godbach    時間: 2007-07-28 00:22
原帖由 happynew 于 2007-7-27 16:08 發(fā)表
編譯庫文件myfunction.c:
這步哪里去了?


多謝happynew指出問題。由于我是先寫在文檔里面,然后再復制到論壇上的,因此把那部分給漏掉了,現(xiàn)在已經(jīng)加上了。
作者: lxw2016    時間: 2007-07-28 14:17
正在學這方面的,感謝LZ
作者: wuguang1023    時間: 2007-07-29 05:07
謝謝LZ學習了 。。。還有更深入一點沒。。。發(fā)出來讓學習一下哦。。。。
作者: Godbach    時間: 2007-07-29 11:02
原帖由 wuguang1023 于 2007-7-29 05:07 發(fā)表
謝謝LZ學習了 。。。還有更深入一點沒。。。發(fā)出來讓學習一下哦。。。。

呵呵,多謝各位捧場啊。兄弟一定盡快的貼出來些更深入的一點東西。這篇太初級了,貼到CU上就感到有點不好意思。以前并沒有深入的學習編程,現(xiàn)在決定要深入的去做了,所以我也在學習中,歡迎一起交流。
作者: kanwairen    時間: 2007-07-29 11:36
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽
作者: newsecond    時間: 2007-07-30 12:47
哈哈 我也在學C..不過沒啥時間,.進度慢..呵呵
作者: Godbach    時間: 2007-07-30 21:42
原帖由 newsecond 于 2007-7-30 12:47 發(fā)表
哈哈 我也在學C..不過沒啥時間,.進度慢..呵呵


共同學習啊,我的進度也很慢。慢功出細活啊。
作者: aaniao999    時間: 2007-07-31 02:26
終于搞出中文來了,
先謝謝下。
我這里也有個例子,是不是必須用這樣的格式,還是你那樣也沒問題?
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif

extern "C" MY_EXPORT int startMain()
{
}
作者: lgfang    時間: 2007-07-31 12:34
原帖由 wuguang1023 于 2007-7-29 05:07 發(fā)表
謝謝LZ學習了 。。。還有更深入一點沒。。。發(fā)出來讓學習一下哦。。。。


http://blog.chinaunix.net/u/23408/showart.php?id=263406
自我感覺比樓主的講得更全面、細致。:)
不過為了練習英文,是用英文寫的。
作者: Godbach    時間: 2007-07-31 21:37
呵呵,寫得很好啊,而且英文也很好,學習了
作者: lgfang    時間: 2007-07-31 22:13
原帖由 Godbach 于 2007-7-31 21:37 發(fā)表
呵呵,寫得很好啊,而且英文也很好,學習了

共同學習 共同學習
作者: MMMIX    時間: 2007-08-01 11:31
原帖由 lgfang 于 2007-7-31 12:34 發(fā)表


http://blog.chinaunix.net/u/23408/showart.php?id=263406
自我感覺比樓主的講得更全面、細致。:)
不過為了練習英文,是用英文寫的。


作者: czawh    時間: 2007-08-01 21:43
不錯落。。。。。。。。。。。!
作者: mokai    時間: 2007-08-02 09:55
多謝樓主分享并傳授。

如果有想用c++寫庫文件的。

在測試文件中要加入聲明,庫文件是c寫的就要
extern "C"
{
int my_lib_function (void);
}

是c++寫的,就只要簡單寫一下聲明就可以了。
作者: Godbach    時間: 2007-08-02 11:28
多謝,又學了一點知識,呵呵
作者: ultrapro    時間: 2007-08-03 08:45
標題: 不錯的,謝謝!
挺好的,謝謝!
作者: marlalee    時間: 2007-08-06 22:09
也可以用:
     ld -G -o libmyfunction.so myfunction.c -cl
一般使用ld生成動態(tài)庫。

另外,在Solaris 下:

    gcc -G -o libmyfunction.so myfunction.c

Solaris怎么總是不一樣!
作者: MMMIX    時間: 2007-08-07 19:31
原帖由 marlalee 于 2007-8-6 22:09 發(fā)表
也可以用:
     ld -G -o libmyfunction.so myfunction.c -cl
一般使用ld生成動態(tài)庫。

另外,在Solaris 下:

    gcc -G -o libmyfunction.so myfunction.c

Solaris怎么總是不一樣!

為嘛要一樣?
作者: Godbach    時間: 2007-08-08 21:46
是啊,UNIX和Linux有時的參數(shù)是不一樣的
作者: MMMIX    時間: 2007-08-09 21:13
原帖由 Godbach 于 2007-8-8 21:46 發(fā)表
是啊,UNIX和Linux有時的參數(shù)是不一樣的

籠統(tǒng)的說 UNIX(這是個商標)或者 Unix 沒有什么意思。不嚴格來說,Linux 也可以稱為 Unix。
作者: Godbach    時間: 2007-08-09 22:23
原帖由 MMMIX 于 2007-8-9 21:13 發(fā)表

籠統(tǒng)的說 UNIX(這是個商標)或者 Unix 沒有什么意思。不嚴格來說,Linux 也可以稱為 Unix。


版主指正的是,小弟用詞不夠嚴謹。
作者: awnun    時間: 2007-08-10 09:53
謝謝
作者: lanneret_sky    時間: 2007-08-11 15:54
多給入門的兄弟一些基礎(chǔ)知識
作者: 一一的愛    時間: 2007-08-11 17:34
不錯啊,的確可以成功,多謝樓主啊,呵呵,真是個好人!
作者: terryno1    時間: 2007-08-14 13:07
好,適合初學,收藏先
作者: lovebible    時間: 2007-08-16 19:15
學習了
作者: hongmy525    時間: 2007-08-17 12:57
謝謝,我正想看這方面的。

加緊學習,也想寫一些有意義的文章出來
作者: Godbach    時間: 2007-08-18 17:30
原帖由 hongmy525 于 2007-8-17 12:57 發(fā)表
謝謝,我正想看這方面的。

加緊學習,也想寫一些有意義的文章出來


好啊,對自己的學習及時總結(jié)是一個好的方法啊。
作者: lower    時間: 2007-08-21 14:55
我也在學習中,支持一下
作者: UCfree    時間: 2007-08-22 22:18
謝謝了
幫你頂一個.
作者: junky    時間: 2007-08-24 12:25
標題: 回復 #1 Godbach 的帖子
學習了 謝謝



作者: yudi2006    時間: 2007-08-31 11:31
學習中...........
作者: straybird    時間: 2007-09-03 18:01
標題: :-)
動態(tài)庫的真正有用的地方是動態(tài)加載,建議google "Dynamic Class Loading for C++ on Linux" 以及 C++-dlopen.pdf
作者: ylky_2000    時間: 2007-10-26 17:24
bu cuo ya ..
作者: gz80    時間: 2007-11-03 02:33
多謝版主
但如何設(shè)定連接時是動態(tài)連接還是靜態(tài)連接?
難道就是看目標文件的后綴?
作者: 54powerman    時間: 2007-11-03 22:04
很棒,收藏學習。LZ HD
作者: Bayweb    時間: 2007-11-04 20:31
標題: 回復 #1 Godbach 的帖子
>>
>>
>>生成 .a 文件可以使用例如:
>>$ gcc -c libmyfun.c -o libmyfun.o
>>$ ar rcs libmyfun.a  libmyfun.o
>>
>>
作者: VAEVA    時間: 2007-11-08 22:29
多謝,對初學者確實好。。。!
作者: dcb314    時間: 2007-11-30 16:33
呵呵
授教了...........
作者: eliry    時間: 2008-09-18 12:51
以前一直用別人寫的庫,現(xiàn)在打算自己寫庫了,樓主的帖子對我?guī)椭艽螅x謝!
作者: kundy    時間: 2008-09-18 15:00
謝謝,學習了!
作者: 317316abcd    時間: 2008-09-19 14:39
為什么會有 這個提示  cannot restore segment prot after reloc: Permission denied
作者: ljwilliam    時間: 2010-05-19 15:02
作為菜鳥,受教了。。。
作者: liseyy    時間: 2011-03-04 17:22

作者: ulovko    時間: 2012-06-17 10:16
學習了!~_~
作者: hansion3406    時間: 2012-10-29 17:05
不錯,很簡潔。。!
作者: Nice026    時間: 2012-12-13 13:41
不錯,我也要實踐一下
作者: 酷了個cool    時間: 2012-12-13 21:55
先回復了。眼睛休息好了來學習。
作者: huang_vincent    時間: 2013-01-09 09:32
如果把庫復制到/usr/lib/下,在編譯應(yīng)用程序時它能夠找的到。應(yīng)該可以不需要加-llibname的吧?
作者: songzhongping    時間: 2013-01-12 23:20
本帖最后由 songzhongping 于 2013-01-12 23:20 編輯

版主,可以加些如果制作自己懂動態(tài)鏈接庫……
作者: meizheruxi    時間: 2013-03-26 10:06
剛接觸Linux編程學到了。。。。




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2