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


        下面以工程libtest為例說明gcc創建和使用靜態庫、動態庫的過程,libtest目錄結構和內容如圖1所示,其中三個文件hello.h,hello.c和main.c的內容如下。

 

圖1

libtest/include/hello.h

 

#ifdef _HELLO_H_
#define _HELLO_H_

void hello();

#endif

libtest/lib/hello.c

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

libtest/src/main.c

#include "hello.h"
int main()
{
	hello();
}

 

靜態庫過程如下:

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

       gcc -c -I../include hello.c

       該命令生成目標文件hello.o,注意:參數-I添加頭文件搜索目錄,這里因為hello.c中有#include “hello.h”,hello.h在libtest/include目錄中,這里需要指定該目錄通知gcc,否則出現錯誤提示“找不到頭文件hello.h”。

       這一步將在libtest/lib目錄中生成一個hello.o文件。

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

       ar rc libhello.ahello.o

       該命令將hello.o添加到靜態庫文件libhello.a,ar命令就是用來創建、修改庫的,也可以從庫中提出單個模塊,參數r表示在庫中插入或者替換模塊,c表示創建一個庫,關於ar命令的詳細使用規則可以參考文章http://blog.csdn.net/xuhongning/article/details/6365200

這一步將在libtest/lib目錄中生成一個libhello.a文件。

(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即可。

       這一步將在libtest/src目錄中生成可執行文件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時卻提示錯誤:

       ./main: error while loading shared libraries: libhello.so: cannotopen shared object file: No such file or directory

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

       export LD_LIBRARY_PATH=”../lib”

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

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

【補充】

       環境變量LD_LIBRARY_PATH指示動態連接器可以裝載動態庫的路徑,在鏈接動態庫文件前設置該變量為庫文件所在路徑,注意:用export LD_LIBRARY_PATH=”…”方式只是臨時生效的,如果要永久有效可以寫入~/.bashrc文件中,跟修改PATH類似,exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:”…”。

       當然如果有root權限的話,也可以修改/etc/ld.so.conf文件,將要添加的動態庫搜索路徑寫入該文件中,然后調用/sbin/ldconfig來達到同樣的目的。


本博客還有另外一篇文章可參考:http://blog.csdn.net/lewsn2008/article/details/8261062


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM