2013-02-17 111 views
8

我做了一個庫文件pila.hpila.c。我用gcc pila.c -c編譯文件pila.c,這個庫工作正常。我已經測試過它。如何使用GCC編譯C庫?

然後我又做了一個庫。該庫有文件pila_funciones_extra.hpila_funciones_extra.c。在這個庫中我需要包含第一個庫。在文件pila_funciones_extra.h我把下一行包括它:

#include "pila.h" 

和文件pila_funciones_extra.c在我把下一行:

#include "pila_funciones_extra.h" 

,因爲它必須是。

但是,當我試圖編譯文件pila_funciones_extra.c編譯器doensn't不承認包含庫pila。它表示庫pila中定義的函數,結構,常量和宏尚未定義。

我試圖編譯它與gcc pila_funciones_extra.c -cgcc pila_funciones_extra.c -c pila.o但它不起作用。

我確定所有文件都在同一個文件夾中。

我正在使用Ubuntu。

任何人都可以告訴我正確的方式來編譯它嗎?

+2

請發佈您正在獲取的_exact_編譯器錯誤(編譯行+第5-10行輸出)。 – Mat 2013-02-17 08:44:42

+0

當你編譯'pila_funciones_extra.c'時,你使用了'-l pila.o'嗎? – 2013-02-17 08:52:25

+0

你是否在使用任何夾雜警衛? '#ifndef's'?例如,如果你在兩個頭文件中都使用相同的話,那麼只有'_extra.h'會變成inc'ed。 – 2013-02-17 08:54:17

回答

1

對於許多文件,你可以先編譯然後分別由庫,然後做到這一點:

ar ruv mylib.a pila_funciones_extra.o pila.o 
ranlib mylib.a 

此命令會導致創建庫,如果它不存在。如果有,則會更新.o文件(或添加到此庫)。 ranlib用於以對加載程序有用的方式對庫進行隨機化。

當你使用這個庫,你這樣做:

gcc -o myapp myapp.c mylib.a 
18

首先,始終以習慣用-Wall編譯(甚至-Wextra,以更充分的警告)選項gcc;它給你幾乎所有的警告,你應該改善你的代碼,直到沒有警告。

然後你經常希望能夠調試你的代碼,所以也通過-ggcc。一旦您對自己的代碼充滿信心,您可以要求gcc-O2一起生成優化的機器代碼。學習使用gdb調試器。

因此,編譯你的第一個庫,假設它的源文件first1.cfirst2.c位於FirstLib/目錄中,例如,

cd FirstLib/ 
gcc -Wall -g -c first1.c -o first1.o 
gcc -Wall -g -c first2.c -o first2.o 

在這一點上,你應該使用Makefile並學習如何使用make,特別是因爲你希望得到您的libfirst.a

ar ruv libfirst.a first1.o first2.o 
ranlib libfirst.a 

那麼你可以傳遞-L../FirstLib -lfirst作爲最後選項gcc命令編譯和鏈接你的程序使用你的libfirst.a

然後編譯你的第二個庫,讓你的Makefile在目錄SecondLib/這很有可能應該包含

# in SecondLib/Makefile 
CC=gcc 
CFLAGS= -I../FirstLib/ -Wall -g 
## add your other stuff for make 

等等等等,你真的想學習如何使用make,寫自己Makefile -s所以需要時間來閱讀GNU make documentation

您可能想通過-Hgcc有它告訴你所有的頭文件,你可能想通過運行也使用remake(除更換make &)來調試比較複雜的Makefile -S(特別是remake -x)。 HereMakefile的示例;你會發現很多其他人!

請閱讀Program Library Howto