Помогите! Скажите, что не так? Система 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.
Кто-нибудь может мне объяснить, что это за бред? Вроде бы все библиотеки соответственно ману включил.
Наверняка с этим кто-нить сталкивался. Не обязательно для этих библиотек. Подскажите плиз, как с этим бороться. Очень надо! Не может же быть, что стандартная библиотека была глючной.
Заранее большое спасибо за помощь.
>Помогите! Скажите, что не так? Система
>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? ;-)
>gcc -o prog prog.c -lpthread
Я работаю в Kdevelop, по идее он же всё это сам должен делать. Ведь на другие библиотеки, типа iostream, string, socket..., он так не ругается
>P.S. Mozhet luchshe snachala nemnogo izuchit'
>veschi bolee prostie chem thread-i?
>;-)
Например? Как ещё можно написать многопоточную программу, если не подходят процессы? К тому же с потоками я из виндов знаком, мне просто надо понять, чего я не дописал. Раньше у меня случались подобные ошибки, но это было из-за того, что я недовключал нужные библиотеки.Тут дело не в том, что библиотека не включается, потому что если я для проверки передаю функциям неправильный тип, то они ругаются, что тип параметров неправильный, и даже виду не подают, что на них андефайнд референс.
> iostream, string,..
они стандартные, "потому и не кусают".
> socket
в соляре с ним надо цеплять аж две либы, в бсде может и нет. Короче - СОЛДАТ прав: смотри man ...pthread.. в своей системе, там, в самых первых строчках указано какой -l<lib> подключать.
ЗЫ: Забудь о чем-либо виндозном, работая в *nix'ах. Может быть ОЧЕНЬ ПОХОЖЕ, но никто и никогда не будет гарантировать что будет так как ты привык.
Типы передаваемых параметров проверяет компилер, потому и ругается. Они прописаны в хидерах. А кросс-референсы связывает линкер, из объетных модулей. И директива -l<lib> относится к линкеру - он знает в какой либе искать объектники вызванных тобой функций.
Спасибо, что научили. Единственное, что параметр нужно задавать не -lpthread, а просто -pthread.
>Спасибо, что научили. Единственное, что параметр
>нужно задавать не -lpthread, а
>просто -pthread.Dlya pthread mozhno i tak i etak, a vot s ostal'nimi lib-ami etot focus vryadli proydet. ;-).
В д.с. -pthread это не указание на подключение конкретной либы, а ключ, указывающий линкеру на то, что задача pthread-ориентированная, иначе говоря - указание как размещать модули в исполнимом файле и т.д. Видимо ЭТОТ линкер и сам знает, где и какие либы взять. Смысл директивы -l<lib> от этого не изменился.Успехов.
ЗЫЖ Может еще оказаться, что абсолютно равносильно, указать -lpthread или -pthread, а то и оба сразу. В последнем случае линкер, видимо, вякнет, что он кого-то проигнорил.
Дело в том, что когда я указал -lpthread, он сказал: "can't find lpthread in ..."
Потом я посмотрел ман, и там в самом начале увидел "-pthread" и решил попробовать.
Меня тут только что просветили, что то, что нужно использовать -pthread вместо -lpthread - это фича, свойственно именно FreeBSD. Так что ман не соврал :)
Всем удачи.