URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 589
[ Назад ]

Исходное сообщение
"pthread меня задолбал!"

Отправлено David , 14-Мрт-02 21:32 
Помогите! Скажите, что не так? Система FreeBSD 4.4. Элеметнарная тестовая прога:

#include <pthread.h>

int main(int argc, char *argv[])
{
  pthread_mutexattr_t attr;
  pthread_mutex_t mutex;

  pthread_mutexattr_init(&attr);
  pthread_mutex_init(&mutex, &attr);
  pthread_mutex_lock(&mutex);
  pthread_mutex_unlock(&mutex);

  return 0;
}

На это компилятор отвечает: undefined reference to `pthread_mutexattr_init' и так на каждую функцию из библиотеки ругается. Причём это касается не только мьютексов, но и других функций из этой библиотеки, а также из semaphore.h.
Кто-нибудь может мне объяснить, что это за бред? Вроде бы все библиотеки соответственно ману включил.
Наверняка с этим кто-нить сталкивался. Не обязательно для этих библиотек. Подскажите плиз, как с этим бороться. Очень надо! Не может же быть, что стандартная библиотека была глючной.
Заранее большое спасибо за помощь.


Содержание

Сообщения в этом обсуждении
"RE: pthread меня задолбал!"
Отправлено Soldier , 15-Мрт-02 08:11 
>Помогите! Скажите, что не так? Система
>FreeBSD 4.4. Элеметнарная тестовая прога:
>
>
>#include <pthread.h>
>
>int main(int argc, char *argv[])
>{
>  pthread_mutexattr_t attr;
>  pthread_mutex_t mutex;
>
>  pthread_mutexattr_init(&attr);
>  pthread_mutex_init(&mutex, &attr);
>  pthread_mutex_lock(&mutex);
>  pthread_mutex_unlock(&mutex);
>
>  return 0;
>}
>
>На это компилятор отвечает: undefined reference
>to `pthread_mutexattr_init' и так на
>каждую функцию из библиотеки ругается.
>Причём это касается не только
>мьютексов, но и других функций
>из этой библиотеки, а также
>из semaphore.h.
>Кто-нибудь может мне объяснить, что это
>за бред? Вроде бы все
>библиотеки соответственно ману включил.
>Наверняка с этим кто-нить сталкивался. Не
>обязательно для этих библиотек. Подскажите
>плиз, как с этим бороться.
>Очень надо! Не может же
>быть, что стандартная библиотека была
>глючной.
>Заранее большое спасибо за помощь.

gcc -o prog prog.c -lpthread

Ili kak tam eta lib-a nazivaetsya.


P.S. Mozhet luchshe snachala nemnogo izuchit' veschi bolee prostie chem thread-i? ;-)



"RE: pthread меня задолбал!"
Отправлено David , 15-Мрт-02 12:34 
>gcc -o prog prog.c -lpthread
Я работаю в Kdevelop, по идее он же всё это сам должен делать. Ведь на другие библиотеки, типа iostream, string, socket..., он так не ругается
>P.S. Mozhet luchshe snachala nemnogo izuchit'
>veschi bolee prostie chem thread-i?
>;-)
Например? Как ещё можно написать многопоточную программу, если не подходят процессы? К тому же с потоками я из виндов знаком, мне просто надо понять, чего я не дописал. Раньше у меня случались подобные ошибки, но это было из-за того, что я недовключал нужные библиотеки.

Тут дело не в том, что библиотека не включается, потому что если я для проверки передаю функциям неправильный тип, то они ругаются, что тип параметров неправильный, и даже виду не подают, что на них андефайнд референс.


"RE: pthread меня задолбал!"
Отправлено Арлекин , 15-Мрт-02 13:32 
> iostream, string,..
они стандартные,  "потому и не кусают".
> socket
в соляре с ним надо цеплять аж две либы, в бсде может и нет. Короче - СОЛДАТ прав: смотри man ...pthread.. в своей системе, там, в самых первых строчках указано какой -l<lib> подключать.
ЗЫ: Забудь о чем-либо виндозном, работая в *nix'ах. Может быть ОЧЕНЬ ПОХОЖЕ, но никто и никогда не будет гарантировать что будет так как ты привык.

"Насчет параметров"
Отправлено Арлекин , 15-Мрт-02 13:38 
Типы передаваемых параметров проверяет компилер, потому и ругается. Они прописаны в хидерах. А кросс-референсы связывает линкер, из объетных модулей. И директива -l<lib> относится к линкеру - он знает в какой либе искать объектники вызванных тобой функций.

"Большое спасибо."
Отправлено David , 15-Мрт-02 14:20 
Спасибо, что научили. Единственное, что параметр нужно задавать не -lpthread, а просто -pthread.

"RE: Большое спасибо."
Отправлено Soldier , 15-Мрт-02 14:47 
>Спасибо, что научили. Единственное, что параметр
>нужно задавать не -lpthread, а
>просто -pthread.

Dlya pthread  mozhno i tak i etak, a vot s ostal'nimi lib-ami etot focus vryadli proydet. ;-).


"RE: Большое спасибо."
Отправлено Арлекин , 15-Мрт-02 15:16 
В д.с. -pthread это не указание на подключение конкретной либы, а ключ, указывающий линкеру на то, что задача pthread-ориентированная, иначе говоря - указание как размещать модули в исполнимом файле и т.д. Видимо ЭТОТ линкер и сам знает, где и какие либы взять. Смысл директивы -l<lib> от этого не изменился.

Успехов.

ЗЫЖ Может еще оказаться, что абсолютно равносильно, указать -lpthread или -pthread, а то и оба сразу. В последнем случае линкер, видимо, вякнет, что он кого-то проигнорил.


"RE: Большое спасибо."
Отправлено David , 15-Мрт-02 19:12 
Дело в том, что когда я указал -lpthread, он сказал: "can't find lpthread in ..."
Потом я посмотрел ман, и там в самом начале увидел "-pthread" и решил попробовать.


"Оказывается, что это особенность FreeBSD."
Отправлено David , 15-Мрт-02 19:19 
Меня тут только что просветили, что то, что нужно использовать -pthread вместо -lpthread - это фича, свойственно именно FreeBSD. Так что ман не соврал :)
Всем удачи.