如何使用GCC在C上编译库?

我用文件pila.hpila.c了一个库。 我使用gcc pila.c -c编译文件pila.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 ,编译器不会识别包含库pila 。 它表示库pila中定义的函数,结构,常量和宏尚未定义。

我尝试使用gcc pila_funciones_extra.c -cgcc pila_funciones_extra.c -c pila.o编译它,但它不起作用。

我确保所有文件都在同一个文件夹中。

我正在研究Ubuntu。

谁能告诉我正确的编译方法?

首先,总是习惯用-Wall (甚至可能还有 -Wextra以获得更多警告)选项来gcc ; 它几乎给你所有警告,你应该改进你的代码,直到没有给出警告。

然后你经常希望能够调试你的代码,所以也把-g传递给gcc 。 一旦您对代码有信心,就可以要求gcc使用-O2生成优化的机器代码。 学习使用gdb调试器。

所以编译你的第一个库,假设它的源文件first1.cfirst2.cFirstLib/目录中,例如

 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文档 。

您可能希望将-H传递给gcc以让它告诉您所有包含的文件,并且您可能还想使用重制 (另外和替换make )来调试更复杂的Makefile -s(特别是通过运行remake -x )。 这是Makefile一个例子; 你会发现很多其他人!

另请阅读程序库Howto 。

对于由许多文件组成的库,您可以先单独编译,然后执行以下操作:

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

如果库尚不存在,则此命令将导致创建库。 如果是,则更新.o文件(或添加到此库中)。 ranlib用于以对加载器有用的方式随机化库。

使用此库时,您可以:

 gcc -o myapp myapp.c mylib.a