views:

405

answers:

5

(I am running Linux Ubuntu 9.10, so the extension for an executable is executablefile.out) I am just getting into modular programming (programming with multiple files) in C and I want to know how to compile multiple files in a single makefile. For example, what would be the makefile to compile these files: main.c, dbAdapter.c, dbAdapter.h? (By the way, If you haven't figured it out yet, the main function is in main.c) Also could someone post a link to the documentation of a makefile?

+1  A: 

GNU make should be what you're looking for.

shinkou
A: 

On the makefile itself, I'll defer to others as it's been a while since I've used them. We use Jam locally now.

Here's the link on make, straight from google

Michael Dorgan
+1  A: 

For an example for compiling multiple files into one executable and the basic structure of a Makefile that can be used to do this, see this answer.

sth
The tutorial posted by Michael looks great, but this is probably more accessible for someone just getting started.
Tyler McHenry
+3  A: 

See my Makefile Tutorial: How To Write A Makefile. It provides a well-crafted Makefile that will build such a project (with multiple C and C++ source files), explains how it works, and warns against common pitfalls as well as poor makefile practices that are all too common to encounter out in the wild.

Michael Aaron Safyan
I just updated it and would be glad to hear feedback.
Michael Aaron Safyan
A: 

The links posted are all good. For you particular case you can try this. Essentially all Makefiles follow this pattern. Everything else is shortcuts and macros.

program: main.o dbAdapter.o
   gcc -o program main.o dbAdapter.o

main.o: main.c dbAdapter.h
   gcc -c main.c

dbAdapter.o dbAdapter.c dbAdapter.h
   gcc -c dbAdapter.c

The key thing here is that the Makefile looks at rules sequentially and builds as certain items are needed.

It will first look at program and see that to build program, it needs something called main.o and dbAdapter.o.

It will then find main.o. However, to build main.o, it will need main.c and dbAdapter.h (I assume dbAdapter.h is included in main.c).

It will use those sources to build main.o by compiling it using gcc. The -c indicates the we only want to compile.

It does the same thing with dbAdapter.o. When it has those two object files, it is ready to link them. It uses the gcc compiler for this step as well. The -o indicates that we are creating a file called program.

aduric
... except that you shouldn't be hard-coding the compiler, and you should leverage the predefined build rules... see my tutorial.
Michael Aaron Safyan
Well of course you're right. But the OP is relatively new to Makefiles and I just wanted to show the underlying process without any indirection.
aduric