#Makefiles in C

25 messages ยท Page 1 of 1 (latest)

granite igloo
#

I've been trying for hours, but my makefile keeps throwing my errors

spare havenBOT
#

When your question is answered use !solved to mark the question as resolved.

Remember to ask specific questions, provide necessary details, and reduce your question to its simplest form. For tips on how to ask a good question use !howto ask.

granite igloo
#

In unix,

#

if i type gcc -o main main.c reminder.c linked_list.c interact.c, I get an executable called main

#

when I ran it with ./main, it worked perfectly fine

#

I double checked,

  1. interact.c uses interact.h, reminder.h
  2. linked_list.c uses linked_list.h
  3. main.c uses reminder.h, interact.h
  4. reminder.c uses reminder.h, linked_list.h
#

But everytime I type make main in unix, I get these long errors

#

Which completely don't make sense to me.

radiant thicket
#

Why are you compiling like that? I.e. why are you first compiling each file individually to a shared object and then try to link them together (which is where your approach stops working).
Just do:

gcc -o main main.c interact.c reminder.c linked_list.c

Why do you want to do this linking process manually?

#

*Also btw, I don't think your Makefile would compile the files to shared objects first, i.e. it would just try to brainlessly take the existing shared objects, without recompiling beforehand, though tbh I'm not 100% sure about this.

Regardless, here's how I like to do it if I'm manually writing my Makefiles.

CC ?= gcc
CFLAGS = -O3 -Wall -Wextra -Wconversion
CFLAGS_DEBUG = -O0 -g3 -Wall -Wextra -Wconversion -fsanitize=address,undefined

.PHONY: debug, release

debug: main.c interact.c reminder.c linked_list.c
        $(CC) $(CFLAGS_DEBUG) -o $@ $^

release: main.c interact.c reminder.c linked_list.c
        $(CC) $(CFLAGS) -o $@ $^

What .PHONY does you may ask? Well, I really don't know, I can just tell you what google tells you:

A phony target is one that is not really the name of a file; rather it is just a name for a recipe to be executed when you make an explicit request. There are two reasons to use a phony target: to avoid a conflict with a file of the same name, and to improve performance.

Now I know that in Makefiles you're supposed to write like <program_name>: <program_files> but I've honestly never used it like that as I always just use it with .PHONY ๐Ÿ’ , basically just creating myself shorter aliases for more complicated commands.

Btw, if you wonder what $@ and $^ do:
$@ evaluates to the rule's name, i.e. in this case debug or release and $^ evaluates to the entire list of files after the :, i.e. in this case main.c interact.c reminder.c linked_list.c

granite igloo
#

We dont cover much of this in class, and the only slide my professor showed me was like that

#

I will try to understand your method, but I will also try to do it in the way my prof taught --

#

thank you so much by the way

#

its just quite odd that when I run both of our make files, unix throws the same exact error

#

maybe its a problem with my c files..

spare havenBOT
#

@granite igloo Has your question been resolved? If so, type !solved :)

radiant thicket
granite igloo
#

I definitely will

#

thank you so much for your time

#

either way

#

have an amazing night

radiant thicket
#

u 2