Home > Software engineering >  Clang error on makefile execution of make
Clang error on makefile execution of make

Time:02-28

So I have two C files which are master.c, slave.c and then config.h and I'm trying to build a makefile for the execution of these files and I'm getting an error.

I'm using a normal terminal on MacOS and when executing make I get the following error:

ss@US3FHIM0XQ86TJG: ~/project-2[master*]$ make
gcc -o master config.h master.c -g -I -std=gnu99
clang: error: cannot specify -o when generating multiple output files
make: *** [master] Error 1

Here is what my makefile looks like:

CC = gcc
CFLAGS = -g -I -std=gnu99

all: master slave

master: config.h master.c
    $(CC) -o $@ $^ $(CFLAGS)

slave: config.h slave.c
    $(CC) -o $@ $^ $(CFLAGS)

clean:
    rm master slave cstest logfile.*

Can someone spot what might be causing this issue?

CodePudding user response:

Remove config.h. You can compile it on the command line and omit "config.h", ie:

gcc -o master master.c -g -I -std=gnu99

Some people like to put that -o at the end:

gcc -g -I -std=gnu99 -c master.c -o master

A more appropriate way would be:

gcc -g -I/usr/include -std=gnu99 -c master.c -o master

Generally, the -I has a path, such as -I/usr/include, but you can omit the -I as your compiler usually looks there first.

Also, you may have to tweak your Makefile and omit the config.h if it is happening when you type make.

Some little errors you can fix by compiling the object by hand (ie, as above, gcc -g -I/usr/include -std=gnu99 -c master.c -o master)

Once you edit Makefile and remove config.h, and perhaps use -I/usr/include or path to your headers, you can run:

make clean

make all

or just:

make slave

or:

make master

etc, etc

CodePudding user response:

$^ is a placeholder for the list of dependencies. That is why the rule

master: config.h master.c
    $(CC) -o $@ $^ $(CFLAGS)

runs the command

gcc -o master config.h master.c -g -I -std=gnu99

Compiling .h produces one output, compiling .c produces another output. The compiler does not know to which of them to apply -o. The proper way is using rules

master: master.c config.h
    $(CC) -o $@ $< $(CFLAGS)

slave: slave.c config.h
    $(CC) -o $@ $< $(CFLAGS)

$< is a placeholder for the first item in the list of dependencies. These rules run gcc properly

gcc -o master master.c -g -I -std=gnu99
gcc -o slave slave.c -g -I -std=gnu99
  • Related