Communities

Writing
Writing
Codidact Meta
Codidact Meta
The Great Outdoors
The Great Outdoors
Photography & Video
Photography & Video
Scientific Speculation
Scientific Speculation
Cooking
Cooking
Electrical Engineering
Electrical Engineering
Judaism
Judaism
Languages & Linguistics
Languages & Linguistics
Software Development
Software Development
Mathematics
Mathematics
Christianity
Christianity
Code Golf
Code Golf
Music
Music
Physics
Physics
Linux Systems
Linux Systems
Power Users
Power Users
Tabletop RPGs
Tabletop RPGs
Community Proposals
Community Proposals
tag:snake search within a tag
answers:0 unanswered questions
user:xxxx search by author id
score:0.5 posts with 0.5+ score
"snake oil" exact phrase
votes:4 posts with 4+ votes
created:<1w created < 1 week ago
post_type:xxxx type of post
Search help
Notifications
Mark all as read See all your notifications »
Q&A

Welcome to Software Development on Codidact!

Will you help us build our independent community of developers helping developers? We're small and trying to grow. We welcome questions about all aspects of software development, from design to code to QA and more. Got questions? Got answers? Got code you'd like someone to review? Please join us.

Comments on make: How to compile all files in a directory.

Post

make: How to compile all files in a directory.

+5
−0

I am learning how to write makefile to compile a c program. I have a directory structure like this:

.
├── include
│   └── library.h
├── lib
│   └── library.c
├── makefile
└── obj

My makefile has this content:

DIR_INC=include
DIR_LIB=lib
DIR_OBJ=obj

$(DIR_OBJ)/library.o: $(DIR_LIB)/library.c $(DIR_INC)/library.h
	 gcc -c -o $@ $<

And it works: library.o gets generated inside obj folder.

Now I want to make it generic so that ALL files inside lib folder get compiled to object files into obj folder, so I replace library with % (because based on my limited/wrong understanding that's how it should work), like so:

DIR_INC=include
DIR_LIB=lib
DIR_OBJ=obj

$(DIR_OBJ)/%.o: $(DIR_LIB)/%.c $(DIR_INC)/%.h
	gcc -c -o $@ $<

but I get this error:

make: *** No targets.  Stop.

I find this Q/A: https://stackoverflow.com/questions/33530341/no-targets-stop. Based on that I add all: target, so my makefile looks like this now:

DIR_INC=include
DIR_LIB=lib
DIR_OBJ=obj

all: $(DIR_OBJ)/%.o

$(DIR_OBJ)/%.o: $(DIR_LIB)/%.c $(DIR_INC)/%.h
	gcc -c -o $@ $<

And I get this error:

make: *** No rule to make target 'obj/%.o', needed by 'all'.  Stop.

Why am I getting these errors and how do I fix them? My goal is to compile all *.c files inside lib directory into *.o object files into obj directory.


Update 1 (after receiving an answer from mr Tsjolder‭ )

I also tried making use of wildcard but was not successful with it. (I did not mention it earlier because I thought this was not the way to go). For the record, here is the latest makefile I had:

DIR_INC=include
DIR_LIB=lib
DIR_OBJ=obj

FILES_LIB=$(wildcard $(DIR_LIB)/*.c)
FILES_OBJ=$(patsubst $(DIR_LIB)/%.c,$(DIR_OBJ)/%.o,$(FILES_LIB))

all: $(FILES_OBJ)
	
$(DIR_OBJ)/%.o: $(FILES_LIB)/%.c $(DIR_INC)/%.h
	gcc -c -o $@ $<
History
Why does this post require attention from curators or moderators?
You might want to add some details to your flag.
Why should this post be closed?

1 comment thread

Simple oversight? (3 comments)
Simple oversight?
Karl Knechtel‭ wrote 2 months ago

I think this is simply a "mental typo" or failure to think it through properly. As a hint: you say that your "goal is to compile all *.c files" - notice that you didn't say "all %.c files"? Also, if you're using existing Stack Overflow Q&A to try to solve something, obviously you shouldn't count on the code in the question to be correct, or even to have only a single conceptual problem. You also shouldn't be satisfied if you find a low-scoring question for what sounds like it should be a general problem. When I used a web search for makefile compile all I found https://stackoverflow.com/questions/170467.

mr Tsjolder‭ wrote 2 months ago

Why the negative undertone? There is no need to project your knowledge or your googlefu on OP. Makefiles can be confusing, especially if you're getting started.

Vanity Slug ❤️‭ wrote 2 months ago · edited 2 months ago

I've been reading almost a dozen tutorials/QAs, watching youtube videos and looking at that lengthy documentation. (I even printed out documentation into a PDF and sent it to my kindle app). Non were saying things which I needed to hear in order for my understanding to click. I was trying to piece together various pieces of information together I found all around the place and until steam started to come out of my ears, which is when I gave up and just asked a question. Like mr Tsjolder said: "Makefiles can be confusing, especially if you're getting started.". This is very true.