user827080
user827080

Reputation:

C & makefile: using source file with other name

I'm pretty new to C and makefiles and thus do not completely understand the inner workings. As an assignment for school, I was told to make a spell checker, implementing three different ways. We were given a set of template files to work with.

In the main file (spell-checker.c), I include hash.h. This file gives me a few function prototypes.

I now have a few source files -- lets call them hash-glib.c and hash-chain.c. The first file uses glib and thus needs to include that library (hence the pkg-config stuff). I can manage to compile and run hash-glib.c using the following makefile functions:

%.o: %.c
    gcc $(CFLAGS) $< -c -o $@

hash-glib.o: hash-glib.c
    gcc $< -c `pkg-config --cflags glib-2.0` $(CFLAGS)

libhash-glib.a: hash-glib.o
    ar rcs libhash-glib.a $<

spell-checker-glib: spell-checker.c libhash-glib.a
    gcc spell-checker.c  -L. \
        -lhash-glib `pkg-config --cflags --libs glib-2.0` $(CFLAGS) -o $@

I tried adding the following to get my desired result (to no avail):

libhash-chaining.a: hash-chaining.o
    ar rcs libhash-chaining.a $<

spell-checker-chaining: spell-checker.c libhash-glib.a
    gcc spell-checker.c -o $@ $(CFLAGS)

What am I missing here? (and for future reference -- what are some keywords I might look into?)

Thanks alot!

EDIT: This is the output:

$ make spell-checker-glib
gcc hash-glib.c -c `pkg-config --cflags glib-2.0` -std=c99 -Wall -Wextra -pedantic -O2
ar rcs libhash-glib.a hash-glib.o
gcc spell-checker.c  -L. \
            -lhash-glib `pkg-config --cflags --libs glib-2.0` -std=c99 -Wall -Wextra -pedantic -O2 -o spell-checker-glib
$ make spell-checker-chaining
gcc spell-checker.c -o spell-checker-chaining -std=c99 -Wall -Wextra -pedantic -O2
Undefined symbols for architecture x86_64:
  "_hash_table_new", referenced from:
       _main in ccGPxFvR.o
  "_hash_table_insert", referenced from:
      _main in ccGPxFvR.o
 "_hash_table_fill", referenced from:
      _main in ccGPxFvR.o
 "_hash_table_size", referenced from:
      _main in ccGPxFvR.o
 "_hash_table_lookup", referenced from:
      _main in ccGPxFvR.o
 "_hash_table_destroy", referenced from:
      _main in ccGPxFvR.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [spell-checker-chaining] Error 1

Upvotes: 1

Views: 223

Answers (1)

Beta
Beta

Reputation: 99174

The problem is here:

spell-checker-chaining: spell-checker.c libhash-glib.a
    gcc spell-checker.c -o $@ $(CFLAGS)

This compiles spell-checker.c into spell-checker-chaining. It requires that libhash-glib.a exist, but doesn't use it, and doesn't mention hash-chaining at all, so the compiler has no idea what it's supposed to use for hash functions.

I suggest you try the following:

spell-checker.o: spell-checker.c
    # I'm kind of guessing here, I don't know what flags this object needs.
    gcc $<  `pkg-config --cflags` $(CFLAGS) -o $@

# I'm assuming spell-checker-chaining doesn't use glib.
spell-checker-chaining: spell-checker.o hash-chaining.o
    gcc $^ -o $@ $(CFLAGS)

Upvotes: 2

Related Questions