Makefile возвращает ошибки - PullRequest
       11

Makefile возвращает ошибки

0 голосов
/ 13 ноября 2011

У меня есть make-файл, который должен компилировать набор файлов C, использующих библиотеку <pthread.h>. Хотя make-файл работал на моей предыдущей установке Linux, я не могу запустить его сейчас. Кто-нибудь может мне с этим помочь?

CC=gcc
CFLAGS=-c -std=c99
LDFLAGS= -lpthread
SOURCES=pc_0.c stak.h
OBJECTS=$(SOURCES:.c=.o)
EXECUTABLE=pcths

all: $(SOURCES) $(EXECUTABLE)   
$(EXECUTABLE): $(OBJECTS) 
    $(CC) $(LDFLAGS) $(OBJECTS) -o $@

.c.o:
    $(CC) $< -o $@ $(CFLAGS)
clean:
    rm -f *.o core

Вот сообщение об ошибке, которое я получаю, набрав в командной строке «make».

gcc pc_0.c -o pc_0.o -c -std=c99
pc_0.c: In function ‘main’:
pc_0.c:25:2: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]
/usr/include/pthread.h:225:12: note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)()’
pc_0.c:29:2: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]
/usr/include/pthread.h:225:12: note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)()’
pc_0.c:33:2: warning: passing argument 3 of ‘pthread_create’ from incompatible pointer type [enabled by default]
/usr/include/pthread.h:225:12: note: expected ‘void * (*)(void *)’ but argument is of type ‘void (*)()’
gcc -lpthread pc_0.o stak.h -o pcths
pc_0.o: In function `main':
pc_0.c:(.text+0x100): undefined reference to `pthread_create'
pc_0.c:(.text+0x15d): undefined reference to `pthread_create'
pc_0.c:(.text+0x1ba): undefined reference to `pthread_create'
pc_0.c:(.text+0x206): undefined reference to `pthread_join'
pc_0.c:(.text+0x21a): undefined reference to `pthread_join'
pc_0.c:(.text+0x22e): undefined reference to `pthread_join'
collect2: ld returned 1 exit status
make: *** [pcths] Error 1

Однако, если я вручную выполню следующие инструкции, исходники будут скомпилированы:

cc pc_0.c -o pc_0.o -c -std=c99
cc pc_0.o -o pcths -lpthread

Ответы [ 3 ]

0 голосов
/ 13 ноября 2011

Публикация фактического сообщения об ошибке крайне важна при попытке отладки вашей проблемы.

Возможно, это не ваша проблема, но я обычно настраиваю свой редактор (emacs) на использование пробелов вместо вкладок для отступа, и это вызывает проблему в make. Я должен выделить все и запустить m-x tabify, чтобы исправить проблему.

0 голосов
/ 13 ноября 2011

Поставьте -lpthread в конце командной строки, после объектного файла, для которого нужны символы из libthread.[a|so]

Когда GNU ld (и другие компоновщики) разрешают неопределенные ссылки, он ищет определения символов только в объектном файле и библиотеках, которые следуют за объектом, который содержит упомянутые ссылки.

0 голосов
/ 13 ноября 2011

Не уверен, насколько это важно, но я всегда добавляю '' вокруг присвоений переменных

...