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

Исходное сообщение
"pthread_rwlock_t"

Отправлено sae , 29-Окт-03 15:47 
как откомпилять вот такой sample на linux? на FreeBSD компиляется без проблем

-----
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>

int
main (void)
{
pthread_rwlock_t rwlock;
int status ;

// status = pthread_mutex_init (&rwlock, NULL);

if (status != 0)
fprintf (stderr, "rwlock_init failed: %s\n", strerror (status));
return 0;
}
--------------


Содержание

Сообщения в этом обсуждении
"pthread_rwlock_t"
Отправлено vvv , 29-Окт-03 16:04 
смотри /usr/include/pthread.h

там найдеш ф-ии для инициализации rw_lock и работы с ними.
А то лепишь rwlock_t в инициализацию митекса - конечно не скомпилится.


"pthread_rwlock_t"
Отправлено sae , 29-Окт-03 16:13 
>смотри /usr/include/pthread.h
>
>там найдеш ф-ии для инициализации rw_lock и работы с ними.
>А то лепишь rwlock_t в инициализацию митекса - конечно не скомпилится.

строчка закоментарена же. так что нипричём.
я спрашивал с какими параметрами надо gcc запустить чтоб скомпилять


"pthread_rwlock_t"
Отправлено vvv , 29-Окт-03 16:44 
gcc -o <foo> -lpthread <foo>.cpp
а если .c то g++ -o <foo> -lpthread <foo>.c

"pthread_rwlock_t"
Отправлено sae , 29-Окт-03 17:01 
>gcc -o <foo> -lpthread <foo>.cpp
>а если .c то g++ -o <foo> -lpthread <foo>.c


и вот что получается
----
bash$ gcc -o foo -lpthread foo.c
foo.c: In function `main':
foo.c:16: `pthread_rwlock_t' undeclared (first use in this function)
foo.c:16: (Each undeclared identifier is reported only once
foo.c:16: for each function it appears in.)
foo.c:16: parse error before "rwlock"


"pthread_rwlock_t"
Отправлено vvv , 29-Окт-03 17:04 
>bash$ gcc -o foo -lpthread foo.c
>foo.c: In function `main':
>foo.c:16: `pthread_rwlock_t' undeclared (first use in this function)
>foo.c:16: (Each undeclared identifier is reported only once
>foo.c:16: for each function it appears in.)
>foo.c:16: parse error before "rwlock"

так я ж тебе и говорю:
>а если .c то g++ -o <foo> -lpthread <foo>.c
rw_lock работают только для C++.
Компились g++, или поменяй расширение на .cpp


"pthread_rwlock_t"
Отправлено sae , 29-Окт-03 17:30 
>>bash$ gcc -o foo -lpthread foo.c
>>foo.c: In function `main':
>>foo.c:16: `pthread_rwlock_t' undeclared (first use in this function)
>>foo.c:16: (Each undeclared identifier is reported only once
>>foo.c:16: for each function it appears in.)
>>foo.c:16: parse error before "rwlock"
>
>так я ж тебе и говорю:
>>а если .c то g++ -o <foo> -lpthread <foo>.c
>rw_lock работают только для C++.
>Компились g++, или поменяй расширение на .cpp


YESS! сработало! гран мерси и респект!
а почему такое ? хмммм.... почему только для с++ ??


"pthread_rwlock_t"
Отправлено vvv , 29-Окт-03 17:34 
да  мне и самому интересно почему в Си не собирается,
подождем, может кто скажет.

но по тексту pthread.h виден define __USE_UNIX98 который
врублен только при компиляции g++, и ручное его определение
толку не дает.


"pthread_rwlock_t"
Отправлено Некто умный. , 29-Окт-03 18:28 
RTFM! Как сказал бы один мой знакомый :)) В качестве FM в данном случае выступает features.h, который включается в самом начале pthread.h
Нечего дефайнить те константы (типа __USE_UNIX98), которые являются константами для служебного пользования и ЯВНО отменяются в этом файле :))

#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <pthread.h>

int
main (void)
{
pthread_rwlock_t rwlock;
int status = pthread_rwlock_init (&rwlock, NULL);

if (status != 0)
   fprintf (stderr, "rwlock_init failed: %s\n", strerror (status));
  return 0;
}


"pthread_rwlock_t"
Отправлено Некто умный. , 29-Окт-03 18:33 
Дело в том, что некоторые функции не являются стандартными, а являются разными расширениями, удовлетворяющими разным стандартам, типа UNIX98 :)
Вот! И так принято, что если тебе нужна какая-то функция из какого-то расширения, то ты перед самым первым #include делаешь #define, чтобы разрешить функции из этого набора, а каждый порядочный *.h файл фключает в себя одной из первых строк features.h, в котором и описаны магические константы для разных стандартов.

"pthread_rwlock_t"
Отправлено vvv , 29-Окт-03 18:35 
Ну вот!
Даже я понял,
спасибо.

"pthread_rwlock_t"
Отправлено sae , 29-Окт-03 18:29 
>да  мне и самому интересно почему в Си не собирается,
>подождем, может кто скажет.
>
>но по тексту pthread.h виден define __USE_UNIX98 который
>врублен только при компиляции g++, и ручное его определение
>толку не дает.

#define _GNU_SOURCE

вот эта строчка в начеле example решила проблемы , компилится при помощи gcc foo.c -o foo -lpthead

ещё больший респект Игорю aka Izh