Adr*_*ian 10 c gcc compilation include libraries
我做了该文件库pila.h和pila.c.我编译文件pila.c,gcc pila.c -c这个库工作正常.我测试了它.
然后我又建了一个图书馆.这个库有文件pila_funciones_extra.h和pila_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 -c和gcc pila_funciones_extra.c -c pila.o,但它不工作.
我确保所有文件都在同一个文件夹中.
我正在研究Ubuntu.
谁能告诉我正确的编译方法?
Bas*_*tch 22
首先,总是习惯用编译-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
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文档.
您可能希望传递-H给gcc它告诉您所有包含的文件,并且您可能还想使用重制(另外和替换   make)来调试更复杂的Makefile-s(特别是通过运行remake -x).这是一个例子Makefile; 你会找到很多其他人!
另请阅读程序库Howto.
对于由许多文件组成的库,您可以先编译然后单独编译,然后执行以下操作:
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)