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

Adr*_*ian 10 c gcc compilation include libraries

我做了该文件库pila.hpila.c.我编译文件pila.c,gcc pila.c -c这个库工作正常.我测试了它.

然后我又建了一个图书馆.这个库有文件pila_funciones_extra.hpila_funciones_extra.c.在这个库中,我需要包含第一个库.在文件中pila_funciones_extra.h我把下一行包括在内:

#include "pila.h"
Run Code Online (Sandbox Code Playgroud)

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

#include "pila_funciones_extra.h"
Run Code Online (Sandbox Code Playgroud)

必须如此.

但是当我尝试编译文件时pila_funciones_extra.c,编译器不会识别包含库pila.它表示pila尚未定义库中定义的函数,结构,常量和宏.

我试图编译它gcc pila_funciones_extra.c -cgcc pila_funciones_extra.c -c pila.o,但它不工作.

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

我正在研究Ubuntu.

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

Bas*_*tch 22

首先,总是习惯用编译-Wall(甚至 -Wextra获得更加警告)选项gcc; 它几乎给你所有的警告,你应该改进你的代码,直到没有给出警告.

然后你经常希望能够调试你的代码,所以也传递-ggcc.一旦您对代码充满信心,就可以要求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
Run Code Online (Sandbox Code Playgroud)

此时,您应该使用a Makefile并学习如何使用make,特别是因为您想要libfirst.a使用它

ar ruv libfirst.a first1.o first2.o
ranlib libfirst.a
Run Code Online (Sandbox Code Playgroud)

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

然后通过让你Makefile的目录SecondLib/很可能应该包含来编译你的第二个库

# in SecondLib/Makefile
CC=gcc
CFLAGS= -I../FirstLib/ -Wall -g
## add your other stuff for make
Run Code Online (Sandbox Code Playgroud)

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

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

另请阅读程序库Howto.


kdm*_*min 4

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

ar ruv mylib.a pila_funciones_extra.o pila.o
ranlib mylib.a
Run Code Online (Sandbox Code Playgroud)

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

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

gcc -o myapp myapp.c mylib.a
Run Code Online (Sandbox Code Playgroud)