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

Posted

技术标签:

【中文标题】如何使用 GCC 在 C 上编译库?【英文标题】:How to compile library on C using GCC? 【发布时间】:2013-02-01 21:12:54 【问题描述】:

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

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

【问题讨论】:

请发布您遇到的 exact 编译器错误(编译行 + 前 5-10 行输出)。 你在编译pila_funciones_extra.c的时候有没有使用-l pila.o这个标志? 您是否使用了任何包含防护? #ifndef's?例如,如果你在两个标题中使用相同的,那么只有 _extra.h 会被添加。 总之,花点时间了解一下make 【参考方案1】:

首先,始终养成使用-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 documentation。

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

另请阅读Program Library Howto。

【讨论】:

【参考方案2】:

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

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

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

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

gcc -o myapp myapp.c mylib.a

【讨论】:

以上是关于如何使用 GCC 在 C 上编译库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在linux上编译C语言? 没有安装gcc组件怎么办?

如何使用 MinGW 在命令行上编译 C 程序?

如何在 64 位 osx 上编译 gcc 32 位应用程序

如何在linux上编译c工程文件

如何在没有 Ivy 的情况下编译库?

如何在 Windows 7 中编译 C 编程? [关闭]