1
votes

I have seen the given two makefiles as follows:

all: thread1 thread2 thread3

CFLAGS=-I/usr/include/nptl -D_REENTRANT
LDFLAGS=-L/usr/lib/nptl -lpthread

clean:
    rm -f thread1 thread2 thread3

######################

all: thread1 thread2 thread3

CFLAGS=-D_REENTRANT
LDFLAGS=-lpthread

clean:
    rm -f thread1 thread2 thread3

Without using makefile, what is the correct command line to compile the thread1.c with gcc?

gcc -o thread1 CFLAGS=-I/usr/include/nptl -D_REENTRANT LDFLAGS=-L/usr/lib/nptl -lpthread thread1.c

4
What are you trying to ask? Those two makefiles will cause different commands to get run. - Carl Norum
I don't want to use these makefile to compile all the source codes and would like to just compile the code one by one through gcc commandline. - q0987
But which set of flags do you need to pass? Do you need the -I and -L flags or not? That's not something anyone here can answer for you. - Carl Norum

4 Answers

4
votes

Your question is answered here

gcc: Do I need -D_REENTRANT with pthreads?

Essentially all you need is

gcc thread1.c -o thread1 -pthread

and gcc will handle all the defines for you.

2
votes

If your code don't have external dependencies beyond pthread:

gcc thread1.c -o thread1 -D_REENTRANT -lpthread

Quote:

Defining _REENTRANT causes the compiler to use thread safe (i.e. re-entrant) versions of several functions in the C library.

1
votes

Almost:

gcc -o thread1 -I/usr/include/nptl -D_REENTRANT -L/usr/lib/nptl thread1.c -lpthread

The *FLAGS variables contain the arguments that are passed to the compiler and linker invocartion, respectively. (In your case you're compiling and linking in one go.) Make sure to add libraries after your own object files.

1
votes

Those two makefiles will generate two different sets of command-line arguments. You could check it yourself just by running make:

$ make -f makefile1
cc -I/usr/include/nptl -D_REENTRANT  -L/usr/lib/nptl -lpthread  thread1.c   -o thread1
$ make -f makefile2
cc -D_REENTRANT  -lpthread  thread1.c   -o thread1

Choose your favourite.