Как скомпилировать многопоточный код с помощью gcc

Я видел данные два make-файла следующим образом:

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

Как правильно без использования makefile скомпилировать thread1.c с помощью gcc?

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


person q0987    schedule 05.07.2011    source источник
comment
Что ты пытаешься спросить? Эти два make-файла вызовут запуск разных команд.   -  person Carl Norum    schedule 05.07.2011
comment
Я не хочу использовать этот make-файл для компиляции всех исходных кодов и хотел бы просто скомпилировать код один за другим через командную строку gcc.   -  person q0987    schedule 05.07.2011
comment
возможный дубликат gcc: мне нужен -D_REENTRANT с pthreads?   -  person Nemo    schedule 05.07.2011
comment
Но какой набор флагов вам нужно пройти? Вам нужны флаги -I и -L или нет? Это не то, что кто-либо здесь может ответить за вас.   -  person Carl Norum    schedule 05.07.2011


Ответы (4)


Если ваш код не имеет внешних зависимостей помимо pthread:

gcc thread1.c -o thread1 -D_REENTRANT -lpthread

Цитата:

Определение _REENTRANT заставляет компилятор использовать потокобезопасные (т. е. реентерабельные) версии нескольких функций в библиотеке C.

person karlphillip    schedule 05.07.2011
comment
Как вы думаете, оба CFLAGS=-D_REENTRANT и LDFLAGS=-lpthread не нужны? - person q0987; 05.07.2011
comment
Я думаю, что код использует nptl. Из книги В многопоточных программах вы сообщаете компилятору, что вам нужна эта функция, определяя макрос _REENTRANT перед любыми строками #include в вашей программе. Но приложенный исходный код thread1.c не включает _REENTRANT, поэтому мне интересно, что мне делать. - person q0987; 05.07.2011

Ответ на ваш вопрос здесь

gcc: нужен ли параметр -D_REENTRANT с pthreads?

По сути все, что вам нужно, это

gcc thread1.c -o thread1 -pthread

и gcc будет обрабатывать все определения для вас.

person JohnKlehm    schedule 05.07.2011

Почти:

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

Переменные *FLAGS содержат аргументы, которые передаются компилятору и компоновщику соответственно. (В вашем случае вы компилируете и связываете за один раз.) Обязательно добавляйте библиотеки после ваших собственных объектных файлов.

person Kerrek SB    schedule 05.07.2011

Эти два make-файла будут генерировать два разных набора аргументов командной строки. Вы можете проверить это сами, просто запустив 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

Выберите свой любимый.

person Carl Norum    schedule 05.07.2011
comment
Исходный make-файл компилирует весь исходный код в каталоге. Поэтому я хочу избежать его запуска с помощью командной строки gcc. - person q0987; 05.07.2011
comment
@ q0987 - но make уже показывает вам командную строку. Просто скопируйте/вставьте его из вывода. - person Carl Norum; 05.07.2011