How to compile library on C using GCC?

Adrian picture Adrian · Feb 17, 2013 · Viewed 31.1k times · Source

I made a library with the files pila.h and pila.c. I compile the file pila.c with gcc pila.c -c and this library works fine. I have tested it.

Then I made another library. This library has the files pila_funciones_extra.h and pila_funciones_extra.c. In this library I need to include the first library. In the file pila_funciones_extra.h I put the next line to include it:

#include "pila.h"

and in the file pila_funciones_extra.c I put the next line:

#include "pila_funciones_extra.h"

as it has to be.

But when I try to compile the file pila_funciones_extra.c the compiler doensn't recognize the inclusion of the library pila. It says that the functions, structures, constants and macros that are defined in the library pila haven't been defined.

I tried to compile it with gcc pila_funciones_extra.c -c and gcc pila_funciones_extra.c -c pila.o but it doesn't work.

I made sure that all the files are in the same folder.

I'm working on Ubuntu.

Can anyone tell me the right way to compile it?

Answer

Basile Starynkevitch picture Basile Starynkevitch · Feb 17, 2013

First, always take the habit to compile with -Wall (and perhaps even also -Wextra to get even more warnings) option to gcc; it gives you almost all warnings, and you should improve your code till no warnings are given.

Then you often want to be able to debug your code, so also pass -g to gcc. Once you are confident with your code you could ask gcc to produce optimized machine code with -O2. Learn to use the gdb debugger.

So compile your first library, assuming its source files first1.c and first2.c are in FirstLib/ directory, with e.g.

cd FirstLib/
gcc -Wall -g -c first1.c -o first1.o
gcc -Wall -g -c first2.c -o first2.o

At this point, you should use a Makefile and learn how to use make, in particular because you want to get your libfirst.a with

ar ruv libfirst.a first1.o first2.o
ranlib libfirst.a

Then you can pass -L../FirstLib -lfirst as the last options to the gcc command compiling and linking your program using your libfirst.a

Then compile your second library by having your Makefile in directory SecondLib/ which very probably should contain

# in SecondLib/Makefile
CC=gcc
CFLAGS= -I../FirstLib/ -Wall -g
## add your other stuff for make

etc etc. You really want to learn how to use make and write your own Makefile-s so take time to read the GNU make documentation.

You may want to pass -H to gcc to have it tell you all the included files, and you may want to also use remake (in addition & replacement of make) to debug your more complex Makefile-s (notably by running remake -x). Here is an example of Makefile; you'll find many others!

Read also the Program Library Howto.