Search code examples
cmakefilegnu-makeobject-files

Building object files that depends on other object files


EDITS: Including link to my makefile

I have a main program that calls a bunch of functions defined in other source files. This is not a problem because I am using cc -c functionSource.c functionHeader.h and generating object files before compiling my main program with cc main.c func1.o func2.o .... -o test.o

I am having problems when one of my functions depends on another function. For example: My main program calls an shuffle function which is defined in it's own source file and the shuffle function calls a swap function which in turn is defined in it's own source file.

When i try to generate the shuffle.o file for my main program using cc -c shuffle.o I get an undefined reference to swap error.

When I try to cc shuffle.c swap.o i get an undefined reference to main error.

Here is my makefile

How do I go about fixing this? Found the problem. I had a swap function declared inside insertionSort.h and shuffle.h but no implementations.


Solution

  • Have a look to the man page: '-c' makes the compiler generating object files only (not trying to link).

    Do the following:

    cc -c insertionSort.c     # => gives insertionSort.o
    cc -c -c functionSource.c # => gives functionSource.o
    cc insertionSort.o functionSource.o ...and-so-on... main.c -o test 
    

    It's not necessary to specify header files - it doesn't help.

    BTW: If you have mor than one implementation file, it is rather useful

    • (a) to learn make
    • (b) stick to the convention that object files and programs should be named like th sources.

    E.g:

    foo.c => foo.o
    bar.c => bar
    

    etc - you get the picture.