如何使用 GCC 在 C 上编译库?
Posted
技术标签:
【中文标题】如何使用 GCC 在 C 上编译库?【英文标题】:How to compile library on C using GCC? 【发布时间】:2013-02-01 21:12:54 【问题描述】:我用文件pila.h
和pila.c
创建了一个库。我用gcc pila.c -c
编译文件pila.c
,这个库工作正常。我已经测试过了。
然后我制作了另一个库。这个库有文件pila_funciones_extra.h
和pila_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 -c
和gcc 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.c
和 first2.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
编译和链接您的程序
然后通过将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 上编译库?的主要内容,如果未能解决你的问题,请参考以下文章