как откомпилять вот такой 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;
}
--------------
смотри /usr/include/pthread.hтам найдеш ф-ии для инициализации rw_lock и работы с ними.
А то лепишь rwlock_t в инициализацию митекса - конечно не скомпилится.
>смотри /usr/include/pthread.h
>
>там найдеш ф-ии для инициализации rw_lock и работы с ними.
>А то лепишь rwlock_t в инициализацию митекса - конечно не скомпилится.строчка закоментарена же. так что нипричём.
я спрашивал с какими параметрами надо gcc запустить чтоб скомпилять
gcc -o <foo> -lpthread <foo>.cpp
а если .c то g++ -o <foo> -lpthread <foo>.c
>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"
>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
>>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.h виден define __USE_UNIX98 который
врублен только при компиляции g++, и ручное его определение
толку не дает.
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;
}
Дело в том, что некоторые функции не являются стандартными, а являются разными расширениями, удовлетворяющими разным стандартам, типа UNIX98 :)
Вот! И так принято, что если тебе нужна какая-то функция из какого-то расширения, то ты перед самым первым #include делаешь #define, чтобы разрешить функции из этого набора, а каждый порядочный *.h файл фключает в себя одной из первых строк features.h, в котором и описаны магические константы для разных стандартов.
Ну вот!
Даже я понял,
спасибо.
>да мне и самому интересно почему в Си не собирается,
>подождем, может кто скажет.
>
>но по тексту pthread.h виден define __USE_UNIX98 который
>врублен только при компиляции g++, и ручное его определение
>толку не дает.#define _GNU_SOURCE
вот эта строчка в начеле example решила проблемы , компилится при помощи gcc foo.c -o foo -lpthead
ещё больший респект Игорю aka Izh