2013-02-17 78 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