12

我用文件pila.hpila.c. 我编译文件pila.cgcc pila.c -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 上工作。

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

4

2 回答 2

26

首先,始终养成使用-Wall(甚至可能还会 -Wextra获得更多警告)选项编译的习惯gcc;它给了你几乎所有的警告,你应该改进你的代码,直到没有给出警告。

然后你经常希望能够调试你的代码,所以也传递-ggcc. 一旦您对自己的代码有信心,您就可以要求gcc使用-O2. 学习使用gdb调试器。

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

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

此时,您应该使用 aMakefile并学习如何使用make,特别是因为您想获得libfirst.a

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

然后,您可以将-L../FirstLib -lfirst最后一个选项传递给gcc使用您的程序编译和链接程序的命令libfirst.a

然后编译你的第二个库,让你的Makefilein 目录SecondLib/很可能应该包含

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

等等等等。你真的很想学习如何使用make和编写你自己的Makefile-s 所以花点时间阅读GNU make 文档

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

另请阅读程序库 Howto

于 2013-02-17T12:15:13.470 回答
2

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

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

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

当你使用这个库时,你会:

gcc -o myapp myapp.c mylib.a
于 2013-02-17T10:47:20.967 回答