I'm having trouble with the linking of my files.
Basically, my program consists of:
gen1
.gen1
- receives input sends to str2value
for processing, outputs results str2value
, breaks input into tokens using "tokenizer" determines what sort of processing to do to each token, and passes them off to str2num
, or str2cmd
. It then returns an array of the results.str2num
- does some processingstr2cmd
- dittoauthor.py
- a python script that generates str2cmd.c
and str2cmd.h
from a header cmdTable.h
.I'm pretty sure I have my includes right, I've checked a couple of times. I've also checked that there are no conditions #ifndef
wrong in the headers.
Here is my Makefile:
#CPP = g++ -lserial CPP = g++ -DTESTMODE C= gcc DEFINES = LURC CFLAGS = -Wall -fshort-enums -D$(DEFINES) PROJECTFILES = gen1.cpp str2value.o STR2VALUEFILES = str2value.cpp str2cmd.o str2num.o tokenizer.o str2value.h gen1 : $(PROJECTFILES) $(CPP) $(CFLAGS) -o gen1 $(PROJECTFILES) str2value.o : $(STR2VALUEFILES) # echo "str2value" $(CPP) $(CFLAGS) -c $(STR2VALUEFILES) str2num.o: str2num.cpp str2value.h str2num.hpp $(C) $(CFLAGS) -c $^ tokenizer.o: tokenizer.cpp tokenizer.hpp $(CPP) $(CFLAGS) -c $^ str2cmd.o : authorCMDs.py cmdTable.h python authorCMDs.py cmdTable.h str2cmd #this uses the gcc -E cmdTable.h -DLURC $(C) $(CFLAGS) -c str2cmd.c str2cmd.h #TODO: add a thing that checks str2cmd.h/.c has not been modified by hand .PHONEY: clean clean: rm *.o .PHONEY: all all: clear make clean make
Here is the output I recieve from make all:
make clean make[1]: Entering directory `/home/frames/LURC/gen1/gen1Source' rm *.o make[1]: Leaving directory `/home/frames/LURC/gen1/gen1Source' make make[1]: Entering directory `/home/frames/LURC/gen1/gen1Source' python authorCMDs.py cmdTable.h str2cmd #this uses the gcc -E cmdTable.h -DLURC str2cmd.c and str2cmd.h, generated from cmdTable.h gcc -Wall -fshort-enums -DLURC -c str2cmd.c str2cmd.h gcc -Wall -fshort-enums -DLURC -c str2num.cpp str2value.h str2num.hpp g++ -DTESTMODE -Wall -fshort-enums -DLURC -c tokenizer.cpp tokenizer.hpp g++ -DTESTMODE -Wall -fshort-enums -DLURC -c str2value.cpp str2cmd.o str2num.o tokenizer.o str2value.h g++: str2cmd.o: linker input file unused because linking not done g++: str2num.o: linker input file unused because linking not done g++: tokenizer.o: linker input file unused because linking not done g++ -DTESTMODE -Wall -fshort-enums -DLURC -o gen1 gen1.cpp str2value.o str2value.o: In function `getValue(char*)': str2value.cpp:(.text+0xbd): undefined reference to `str2cmd(char*)' str2value.cpp:(.text+0x102): undefined reference to `str2num(char*)' str2value.o: In function `getAllValues(char*)': str2value.cpp:(.text+0x164): undefined reference to `tokenizer::tokenizer(char*)' str2value.cpp:(.text+0x177): undefined reference to `tokenizer::getNumTokens(char const*)' str2value.cpp:(.text+0x1a9): undefined reference to `tokenizer::getNextToken(char const*)' str2value.cpp:(.text+0x1e9): undefined reference to `tokenizer::getNumTokens(char const*)' str2value.cpp:(.text+0x201): undefined reference to `tokenizer::~tokenizer()' str2value.cpp:(.text+0x25b): undefined reference to `tokenizer::~tokenizer()' collect2: ld returned 1 exit status make[1]: *** [gen1] Error 1 make[1]: Leaving directory `/home/frames/LURC/gen1/gen1Source' make: *** [all] Error 2
Any suggestions about what this is about? STR2VALUESFILES
has all the object files I need, to define the missing functions.
I think you are confused about how the compiler puts things together. When you use -c
flag, i.e. no linking is done, the input is C++ code, and the output is object code. The .o
files thus don't mix with -c
, and compiler warns you about that. Symbols from object file are not moved to other object files like that.
All object files should be on the final linker invocation, which is not the case here, so linker (called via g++
front-end) complains about missing symbols.
Here's a small example (calling g++
explicitly for clarity):
PROG ?= myprog OBJS = worker.o main.o all: $(PROG) .cpp.o: g++ -Wall -pedantic -ggdb -O2 -c -o $@ $< $(PROG): $(OBJS) g++ -Wall -pedantic -ggdb -O2 -o $@ $(OBJS)
There's also makedepend
utility that comes with X11 - helps a lot with source code dependencies. You might also want to look at the -M
gcc
option for building make
rules.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With