| 導購 | 订阅 | 在线投稿
分享
 
 
 

生成靜態連接庫

來源:互聯網  2008-06-01 01:54:44  評論

靜態庫及動態庫的建立

UNIX系統及各種軟件包爲開發人員提供了大量的庫文件。但一般情況下這些庫文件還

不能足以滿足用戶的所有需求。開發人員大多會根據他們自己的開發、研究要求編寫

出許多函數。對于這些函數,假如都用在命令行中指定源文件的方法同調用它們的程

序鏈接起來,雖然也是可以的,但也有一些缺點:

.....

下面來看看如何生成靜態庫。

我們知道靜態庫也稱檔案庫,在此檔案文件中實際上是收集了一系列的目標文件。這

些目標文件就是由cc(gcc)函數的源代碼編譯生成的。因此,靜態庫的生成方法實際上

可以分成兩步:

1.將各函數代碼所在的源文件編譯成目錄文件。例如,對于myfunc.c,可以用如下命令

將其編譯成目標文件:

gcc -c myfunc.c

當然在有多個源文件時,只需在gcc 命令行中將其分別列上就可以了。

經此一步我休養將能夠得到各源文件的目標文件。對上例,將得到myfunc.o

2.將各目標文件收集起來放到一個靜態庫文件中。這主要借助于ar命令完成,如:

ar r ~/lib/liBTest.a myfunc.o

建立動態鏈接庫、並不需要用到其他的工具,借助于gcc命令即可完成。此時需在命令

行中加上-K PIC和-G這兩個選項,如下我們可以建立libtest的動態版本:

gcc -K PIC -G -o $HOME/lib/libtest.so myfunc.c

--

發信人: hellguard (小四), 信區: Unix

標 題: 順便貼個生成Linux動態庫的

發信站: BBS 水木清華站 (Fri Nov 12 10:49:03 1999)

本來格式很好看的,但因爲要貼到這裏所以

扭曲了不少,見諒見諒。這裏給的是linux下的例子,

但是solaris下的也差不多,假如你發現不同,就給

個具體說明出來,好不好。

ldd filename就可以看到程序用到哪些庫。

ld -o OUTPUT /lib/crt0.o hello.o -lc

ld將輸出最終結果文件 OUTPUT ,

用到/lib/crt0.o hello.o以及libc.a

libc.a來自標准庫搜索路徑,請參看-l選項的討論

ld的選項順序任意,可以重複,後面的將覆蓋前面的。

gcc -c -fPIC linuxlib.c -O3 -o linuxlib.o

gcc -shared -Wl,-soname,liblinuxlib.so.1

-O3 -o liblinuxlib.so.1.0 linuxlib.o

(

ld -m elf_i386 -shared -o liblinuxlib.so.1.0

-soname liblinuxlib.so.1 linuxlib.o

這個語句産生的文件更小,不知道二者有何區別

-o liblinuxlib.so.1.0 這個文件名任意,要害是後面

兩個符號連接要正確

當然推薦使用有意義的帶版本信息的名字,包括

-soname liblinuxlib.so.1

)

ln -sf liblinuxlib.so.1.0 liblinuxlib.so.1

(

運行時,dynamic linker根據 -soname

liblinuxlib.so.1 去尋找liblinuxlib.so.1

)

ln -sf liblinuxlib.so.1 liblinuxlib.so

(

編譯的最後一個步驟,ld命令根據 -llinuxlib

選項去尋找liblinuxlib.so

)

eXPort LD_LIBRARY_PATH=.

(

編譯時、運行時都需要這個變量的存在

編譯時假如不存在這個變量,編譯依舊通過,但

用ldd查看會發現沒有動態連接信息

運行時假如不存在這個變量,將報告無法找到動態連接庫

這個變量假如不用相對路徑".",換了運行環境就比較麻煩

export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

)

gcc -L. -lbsd -llinuxlib -O3 -o linuxkiller linuxkiller.c

(

-L. 指出除標准庫搜索路徑之外的庫搜索路徑,假如不指

定,將找不到liblinuxlib.so

這個選項並不能代替 LD_LIBRARY_PATH 變量,否則雖然編譯通過,

但用ldd linuxkiller的時候會發現沒有動態連接信息

)

可以把自己的動態連接庫放到/usr/lib或者/lib下去,或者

修改/etc/ld.so.conf

然後利用/sbin/ldconfig。具體請man ldconfig

--

發信人: hellguard (小四), 信區: Unix

標 題: Re: help :static library----what's wrong--Thanks.

發信站: BBS 水木清華站 (Thu Aug 16 14:22:39 2001)

【 在 hululu (呼噜噜~回家中) 的大作中提到: 】

: I am building a static library. But I do not know what is

: wrong. Below is a sample:

: tt.c:

: #include <stdio.h>

: int func(){

: printf("func test

");

: return 0;

: }

: ii.c:

: #include <stdio.h>

: extern int func();

: ...................

★ 生成靜態鏈接庫舉例

1. vi demo.h

void demo ( void );

vi demo.c

#include <stdio.h>

#include "demo.h"

void demo ( void )

{

printf( "hello world

" );

return;

}

2. g++ -Wstrict-prototypes -Wall -Wunused -O3 -c demo.c -o demo.o

file demo.o

3. ar -rsv libdemo.a demo.o

a - demo.o

file libdemo.a

nm -s libdemo.a

ar -tv libdemo.a

4. vi scz.c

#include <stdio.h>

#include "demo.h"

int main ( int argc, void * argv[] )

{

demo();

return 0;

}

5. g++ scz.c -L. -ldemo -Wstrict-prototypes -Wall -Wunused -O3 -o scz

-- (http://www.fanqiang.com) 進入【UNIX論壇】

--------------------------------------------------------------------------------

  靜態庫及動態庫的建立 UNIX系統及各種軟件包爲開發人員提供了大量的庫文件。但一般情況下這些庫文件還 不能足以滿足用戶的所有需求。開發人員大多會根據他們自己的開發、研究要求編寫 出許多函數。對于這些函數,假如都用在命令行中指定源文件的方法同調用它們的程 序鏈接起來,雖然也是可以的,但也有一些缺點: ..... 下面來看看如何生成靜態庫。 我們知道靜態庫也稱檔案庫,在此檔案文件中實際上是收集了一系列的目標文件。這 些目標文件就是由cc(gcc)函數的源代碼編譯生成的。因此,靜態庫的生成方法實際上 可以分成兩步: 1.將各函數代碼所在的源文件編譯成目錄文件。例如,對于myfunc.c,可以用如下命令 將其編譯成目標文件: gcc -c myfunc.c 當然在有多個源文件時,只需在gcc 命令行中將其分別列上就可以了。 經此一步我休養將能夠得到各源文件的目標文件。對上例,將得到myfunc.o 2.將各目標文件收集起來放到一個靜態庫文件中。這主要借助于ar命令完成,如: ar r ~/lib/liBTest.a myfunc.o 建立動態鏈接庫、並不需要用到其他的工具,借助于gcc命令即可完成。此時需在命令 行中加上-K PIC和-G這兩個選項,如下我們可以建立libtest的動態版本: gcc -K PIC -G -o $HOME/lib/libtest.so myfunc.c -- 發信人: hellguard (小四), 信區: Unix 標 題: 順便貼個生成Linux動態庫的 發信站: BBS 水木清華站 (Fri Nov 12 10:49:03 1999) 本來格式很好看的,但因爲要貼到這裏所以 扭曲了不少,見諒見諒。這裏給的是linux下的例子, 但是solaris下的也差不多,假如你發現不同,就給 個具體說明出來,好不好。 ldd filename就可以看到程序用到哪些庫。 ld -o OUTPUT /lib/crt0.o hello.o -lc ld將輸出最終結果文件 OUTPUT , 用到/lib/crt0.o hello.o以及libc.a libc.a來自標准庫搜索路徑,請參看-l選項的討論 ld的選項順序任意,可以重複,後面的將覆蓋前面的。 gcc -c -fPIC linuxlib.c -O3 -o linuxlib.o gcc -shared -Wl,-soname,liblinuxlib.so.1 -O3 -o liblinuxlib.so.1.0 linuxlib.o ( ld -m elf_i386 -shared -o liblinuxlib.so.1.0 -soname liblinuxlib.so.1 linuxlib.o 這個語句産生的文件更小,不知道二者有何區別 -o liblinuxlib.so.1.0 這個文件名任意,要害是後面 兩個符號連接要正確 當然推薦使用有意義的帶版本信息的名字,包括 -soname liblinuxlib.so.1 ) ln -sf liblinuxlib.so.1.0 liblinuxlib.so.1 ( 運行時,dynamic linker根據 -soname liblinuxlib.so.1 去尋找liblinuxlib.so.1 ) ln -sf liblinuxlib.so.1 liblinuxlib.so ( 編譯的最後一個步驟,ld命令根據 -llinuxlib 選項去尋找liblinuxlib.so ) eXPort LD_LIBRARY_PATH=. ( 編譯時、運行時都需要這個變量的存在 編譯時假如不存在這個變量,編譯依舊通過,但 用ldd查看會發現沒有動態連接信息 運行時假如不存在這個變量,將報告無法找到動態連接庫 這個變量假如不用相對路徑".",換了運行環境就比較麻煩 export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH ) gcc -L. -lbsd -llinuxlib -O3 -o linuxkiller linuxkiller.c ( -L. 指出除標准庫搜索路徑之外的庫搜索路徑,假如不指 定,將找不到liblinuxlib.so 這個選項並不能代替 LD_LIBRARY_PATH 變量,否則雖然編譯通過, 但用ldd linuxkiller的時候會發現沒有動態連接信息 ) 可以把自己的動態連接庫放到/usr/lib或者/lib下去,或者 修改/etc/ld.so.conf 然後利用/sbin/ldconfig。具體請man ldconfig -- 發信人: hellguard (小四), 信區: Unix 標 題: Re: help :static library----what's wrong--Thanks. 發信站: BBS 水木清華站 (Thu Aug 16 14:22:39 2001) 【 在 hululu (呼噜噜~回家中) 的大作中提到: 】 : I am building a static library. But I do not know what is : wrong. Below is a sample: : tt.c: : #include <stdio.h> : int func(){ : printf("func test "); : return 0; : } : ii.c: : #include <stdio.h> : extern int func(); : ................... ★ 生成靜態鏈接庫舉例 1. vi demo.h void demo ( void ); vi demo.c #include <stdio.h> #include "demo.h" void demo ( void ) { printf( "hello world " ); return; } 2. g++ -Wstrict-prototypes -Wall -Wunused -O3 -c demo.c -o demo.o file demo.o 3. ar -rsv libdemo.a demo.o a - demo.o file libdemo.a nm -s libdemo.a ar -tv libdemo.a 4. vi scz.c #include <stdio.h> #include "demo.h" int main ( int argc, void * argv[] ) { demo(); return 0; } 5. g++ scz.c -L. -ldemo -Wstrict-prototypes -Wall -Wunused -O3 -o scz -- (http://www.fanqiang.com) 進入【UNIX論壇】 --------------------------------------------------------------------------------
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有