生成靜態連接庫

靜態庫及動態庫的建立

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系統及各種軟件包爲開發人員提供了大量的庫文件。但一般情況下這些庫文件還  不能足以滿足用戶的所有需求。開發人員大多會根據他們自己的開發、研究要求編寫  出許多函數。對于...查看完整版>>生成靜態連接庫
 
靜態連接庫的生成和使用
靜態連接庫的生成和使用 作者: 一、靜態庫的生成 a) 用VC向導生成一個win32 Static Library工程 b) 添加頭文件,聲明函數接口。 c) 添加實現文件,包含頭文件並實現...查看完整版>>靜態連接庫的生成和使用
 
Linux 編程之生成靜態連接庫
靜態庫及動態庫的建立 UNIX系統及各種包爲開發人員提供了大量的庫文件。但一般情況下這些庫文件還 不能足以滿足用戶的所有需求。開發人員大多會根據他們自己的開發、研究要求編寫 出許多函數。對于這些函數,如果都用...查看完整版>>Linux 編程之生成靜態連接庫
 
根據模板文件生成一個靜態html文件的類
一般我們用PHP輸出一個html文件,總是用$head="<head>……</head>"這樣一個長串來完成。本類主要提供一個簡便的用PHP輸出html文件的方法。避免了在程序中出現過多的帶有長字串。類定義文件 createhtml.c...查看完整版>>根據模板文件生成一個靜態html文件的類
 
利用php的ob_start來生成靜態頁面的方法
雖然方法很多,但使用起來簡便容易的,我覺得還是先判斷已經生成的首頁文件的生成時間和現有時間之間的差值,如果滿足某個值就開始生成,這種方法比較來得容易,不多說了,開始吧!在開始之前還是提一下三個函數吧:"...查看完整版>>利用php的ob_start來生成靜態頁面的方法
 
Linux系統中靜態庫和動態庫的生成和使用
一、靜態庫的創建和使用: 1、生成靜態庫 :庫名 libmylib.a ar rcs libmylib.a mylib.o 2、將靜態庫copy到 /usr/lib/ 或/lib/ 目錄下 cp libmylib.a /usr/lib/ 3、靜態庫的使用 比如測試文件爲test.c gcc -0 test t...查看完整版>>Linux系統中靜態庫和動態庫的生成和使用
 
SSI技術—SHTML(生成靜態時用的最火)
什麽是shtml SHTML語法 SHTML教程 格式 編寫 技術使用SSI (Server Side Include)技術想要找到既富有創意的平面設計人員,又有腳本開發經驗的人員,實在是太難了。而如果一個百分之百的頁面都是php腳本的網站,將爲頁...查看完整版>>SSI技術—SHTML(生成靜態時用的最火)
 
JSP生成靜態頁實踐及其設計思想[2]
爲了減輕服務器壓力,將原來的文章管理系統由JSP文件的從數據庫中取數據顯示改爲由jsp生成靜態html文件後直接訪問html文件。下面是一個簡單的示例1.buildhtml.jsp<%@ page contentType="text/html; charset=gb231...查看完整版>>JSP生成靜態頁實踐及其設計思想[2]
 
JSP生成靜態頁實踐及其設計思想[1]
引子:我們以兩個大型網站爲例作比較:51job和智聯招聘(先聲明我不是爲他們作廣告,僅以他們爲例作技術上的比較)51job采用的是比較“先進”的php技術,而智聯用的是比較落後的asp.但我們可能會明顯的感覺到51job的...查看完整版>>JSP生成靜態頁實踐及其設計思想[1]
 
 
回到王朝網路移動版首頁