2012-08-03 49 views
0

我想要一個靜態庫,並能夠做出一個正確遵循的yolinux教程 http://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.htmlç靜態庫的Linux

時,我想包括靜態庫,使一個新的靜態庫的問題就出現了。 方案是:

gcc -Wall -c cdbSearch.c 
ar -cvq cdbSrc.a cdbSearch.o cdb.a 

這個成功創建了一個名爲cdbSrc.a

靜態庫,但是當我試圖用我的測試程序

gcc -o cdbtest cdbtest.c cdbSrc.a 
cdbSrc.a(cdbSearch.o): In function `cdb_search': 
cdbSearch.c:(.text+0xa2): undefined reference to `cdb_seek' 
collect2: ld returned 1 exit status 

連結這個它給了我一個錯誤說, cdb_seek不能被參考,這實際上是cdb.a的一部分

如果我用cdb.a編譯測試程序,它工作正常,但它沒有t服務的目的..

gcc -o cdbtest cdbtest.c cdbSrc.a cdb.a 

和二進制文件已成功創建cdbtest。

這是預期的行爲,是的,爲什麼?如果不是,我做錯了什麼。

+1

的可能重複[集合靜態庫(http://stackoverflow.com/questions/9547061/aggregate-static-libraries) – Mat 2012-08-03 05:08:31

回答

3

是的。這是預期的行爲。您需要鏈接所有靜態庫以形成二進制文件。與共享庫不同的靜態庫不會保存到其他庫的鏈接。

1

靜態庫只是對象文件的存檔。您必須使用ar x

在這之後解壓cdb.a,包解壓後的所有對象加cdbSearch.o到cdbSrc.a

+0

看起來有趣的選項將嘗試了這一點.... – 2012-08-03 05:19:41

+1

你可以這只是爲了欺騙目的。但是,最好在獨立的庫中保留不相關的功能,因爲它有助於更​​好的維護。 – Jay 2012-08-03 05:31:30

1

你想創建一個新的靜態庫,它應該包含cdbSearch.o,所有的對象文件在cdb.a沒錯。

我假設像cdb.a有兩個目標文件,它們是first.osecond.o

ar允許將目標文件添加到現有的靜態庫。你可以執行下面的命令。

ar r cdb.a cdbSearch.o

如果名爲cdb.a呈現庫,然後上面的命令將添加新的目標文件cdbSearch.o成說。否則它將創建新的靜態庫cdb.a,它將只包含一個目標文件(cdbSearch.o)。

現在cdb.a將包含3個對象文件(first.o,second.ocdbSearch.o)。現在,您可以根據需要重命名靜態庫文件名,mv cdb.a cdbSrc.a

我們還可以使用d選項從靜態庫中刪除任何現有的目標文件。例如,如果要從cdbSrc.a刪除目標文件second.o,則可以執行以下命令。

ar d cdbSrc.a second.o

使用t選項列出一個靜態庫的目標文件。

ar t cdbSrc.a