So I’ve been playing this 3D sort of 2048 game on my phone for a while now, and it’s made me want to try writing a text-based 2048 game.
I copied the c-skeleton
directory to a new directory named 2048
, and I think I’ve got the Makefile trimmed down to what I need. I also added minunit.h
to src/
for testing purposes.
I’m starting with coding up a Cell — my name for a square of the 2048 board — so i can have a Board of an arbitrary size.
Here are my directory structure, Makefile, cell.h, cell.c, and test code. For whatever reason, the linker complains that it can’t find Cell_create
when I try to run make tests
.
What’s going on? I #include
d cell.h
in the test file, and I told make
that src
would be used for includes
Yes, but that only takes care of the header files. You need to add the object files as arguments to the compiler for the tests.
Okay, so I updated the tests
target of my Makefile so it looks like
# The Unit Tests
.PHONY: tests
tests: $(TESTS) $(OBJECTS)
$(CC) $(SOURCES) -c
sh ./tests/runtests.sh
So as I understand, this means that tests
depends on the *_test
executables — which, in turn, depend on the corresponding _tests.c
file in tests/
— and the object files in src/
. The rules state that the C compiler should compile the source files into .o
files, but not link them. make tests
still fails, which makes sense. This, I assume, is the issue, but how do I link it up correctly?
I watched the video for Ex30, just in case, but of course, Zed is focusing on testing libex29
. This didn’t seem totally useful.
I guess something like this should work? You have to add the objects to the $(TESTS)
target where the tests are compiled, not to the one that runs them.
$(TESTS): $(OBJECTS)
tests: $(TESTS)
sh ./tests/runtests.sh
Still no luck, unfortunately.
If you can share the project (e.g. via GitHub) I’ll take a look.
Oh wait, I forgot the most important line above. You’ll need an explicit compile command:
$(TESTS): $(OBJECTS)
$(CC) $(CFLAGS) -o $(patsubst %.c,%,$(@)) $@ $(OBJECTS)
Here’s the repo. Look at the cell
branch to see all the code I’m currently working on.