如何使用GCC编译C语言库?

17

我使用文件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操作系统。
有人可以告诉我正确的编译方法吗?

2
请发布您正在收到的确切编译器错误(编译行+输出的前5-10行)。 - Mat
你在编译 pila_funciones_extra.c 时是否使用了标志 -l pila.o - Konfle Dolex
你是否使用任何预处理器包含保护指令?如 #ifndef?例如,如果在两个头文件中使用相同的指令,则只会包含 _extra.h - Bernd Elkemann
简而言之,花时间学习make - Basile Starynkevitch
2个回答

32

首先,养成使用-Wall(也许甚至还要使用-Wextra选项来获得更多警告)编译器选项进行编译的习惯;这会给你几乎所有的警告,并且你应该改进你的代码直到没有警告。

然后,通常情况下,您希望能够调试代码,因此也将-g传递给gcc。一旦您对自己的代码有信心,您可以要求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 库。

接下来,通过在目录 SecondLib/ 中拥有您的Makefile 来编译第二个库,该目录很可能应该包含以下内容:

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

等等等等。您真的想学习如何使用make并编写自己的Makefile,所以请花时间阅读GNU make文档

您可能希望向gcc传递-H以让它告诉您所有包含的文件,您可能还想使用remake(除了替换make外),以调试更复杂的Makefile(尤其是通过运行remake -x)。这里是一个Makefile示例;您会发现其他许多示例!

还要阅读程序库指南


4

对于一个由多个文件组成的库,您可以首先分别编译每个文件,然后执行以下操作:

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

该命令会在库不存在时创建它。如果已存在,则更新(或添加到该库). ranlib 用于以对加载器有用的方式随机化库。使用该库时,需执行以下操作:
gcc -o myapp myapp.c mylib.a

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接