1. 程式人生 > >gcc建立和使用動態庫、靜態庫

gcc建立和使用動態庫、靜態庫

本文以工程libtest為例來說明用gcc建立和使用靜態庫、動態庫的過程。libtest工程目錄結構如下:

libtest/include/hello.h檔案內容:

#ifndef __HELLO_H__
#define __HELLO_H__
 
void sayHello(void);
 
#endif           

libtest/lib/hello.c檔案內容:

#include "hello.h"
#include <stdio.h>
 
void sayHello(void)
{
     printf("Hello Geeks !\n");
}      

libtest/

src/main.c檔案內容:

#include "hello.h"
 
int main(void)
{
     sayHello();
 
     return 0;
}    

建立並使用靜態庫:

1,進入libtest/lib目錄,執行命令:

 gcc -c -I../include hello.c
該命令將會在當前目錄生成目標檔案hello.o

注意:引數-I是新增標頭檔案搜尋目錄,這裡因為hello.c中有#include "hello.h", hello.h在libtest/include目錄中,這裡需要指定該目錄通知gcc,否則會出現錯誤提示“找不到標頭檔案hello.h”。

2,在libtest/lib目錄中執行命令:

 ar rc libhello.a hello.o
該命令將會在當前目錄生成靜態庫檔案libhello.a

ar命令就是用來建立、修改庫的,也可以從庫中提出單個模組,引數r表示在庫中插入或者替換模組,c表示建立一個庫

3,進入libtest/src目錄,執行命令:

 gcc main.c -I../include -L../lib -lhello -o main
該命令將編譯main.c並連結靜態庫檔案libhello.a生成可執行檔案main

注意:引數-L是新增庫檔案搜尋目錄,因為libhello.a在libtest/lib目錄中,這裡需要指定該目錄通知gcc,引數-l是指定連結的庫檔名稱,名稱不用寫全名libhello.a,只用寫hello即可。

4,執行main程式:

./main

建立並使用動態庫:

1,進入libtest/lib目錄,執行命令:

 gcc hello.c -I../include -fPIC -shared -o libhello.so
這一步將在當前目錄生成動態庫檔案libhello.so。引數-fPIC -shared是固定格式,不用糾結他們什麼意思。

2,進入libtest/src目錄,執行命令:

gcc main.c -I../include -L../lib -lhello -o main

此時在當前目錄中已經生成了可執行檔案main,執行./main時卻提示錯誤:

也就是找不到動態庫檔案libhello.so,在網上找了答案說如果遇到這樣的問題需要設定環境變數LD_LIBRARY_PATH,如下:

export LD_LIBRARY_PATH="../lib"

然後再執行./main就沒有錯誤了。


PS:

      環境變數LD_LIBRARY_PATH指示動態聯結器可以裝載動態庫的路徑,在連結動態庫檔案前設定該變數為庫檔案所在路徑。注意:用export LD_LIBRARY_PATH=”…”方式只是臨時生效的,如果要永久有效可以寫入~/.bashrc檔案中,跟修改PATH類似,export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:”…”當然如果有root許可權的話,也可以修改/etc/ld.so.conf檔案,將要新增的動態庫搜尋路徑寫入該檔案中,然後呼叫/sbin/ldconfig來達到同樣的目的。