繁体   English   中英

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

[英]How to compile library on C using GCC?

我用文件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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM