Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to use makefile to include .a static library and .h file from another directory in C?

Tags:

c++

c

makefile

I have created a .h header file, implemented and created .a static library file, both of them are in directory in say, /home/data/folder1.

I have another .c file which will use link the .h header file and the .a library file. However, the .c file is in directory /home/data/folder2.

What should I write in the Makefile (which is also located in /home/data/folder2)? Also, should I include myheader.h in the .c file that I want to compile? Here is what I have so far, but not working:

LIBB = -L/home/data/folder1/libmylib.a

HEADER = -L/home/data/folder2/myheader.h

main: main.o
    gcc $(HEADER) $(LIBB) $< -o $@

main.o: main.c
    gcc -c main.c

.PHONY: clean

clean:

    rm -f *.o *.~ a.out main

Any help will be appreciated, thanks in advance!

like image 997
CTownsend Avatar asked Oct 13 '13 02:10

CTownsend


1 Answers

Including header files and libraries from non-standard directories is simple.

You have the path to the directory containing the library and the one containing the header, so we store those in variables:

LIBB = /home/data/folder1
LIBINCLUDE = /home/data/folder2

Now GCC needs to know where to look for headers, so we simply include it in the CFLAGS. The linker (not the compiler) needs to know where to look for libraries, so we can add that to LDFLAGS:

CFLAGS += -I$(LIBINCLUDE)
LDFLAGS += -L$(LIBB)

It will use the CFLAGS and LDFLAGS automatically if you don't explicitly run GCC.

But for the link step, it needs to know that the library is needed, so:

LDFLAGS += -static -lmylib

The linker will look for libmylib.a in all of the directories named by the -L options in LDFLAGS.

Since your rules for main and main.o are explicit, change them like so (but be sure to use a tab, not 4 spaces):

main: main.o
    gcc $(LDFLAGS) $< -o $@

main.o: main.c
    gcc $(CFLAGS) $< -o $@
like image 109
greyfade Avatar answered Oct 01 '22 00:10

greyfade