Ошибка сборки libpthreads-stubs-0.3 в Windows
Я пытаюсь скомпилировать libpthreads-stubs-0.3 (для vaapi) на машине с Windows, которая имеет среду MinGW и MSys. Я установил пакет mingw32-pthreads-w32 dev (версия 2.9.1-1) в MinGW.
Теперь, когда я пытаюсь скомпилировать libpthreads-stubs-0.3 (есть только один файл с именем stubs.c
) я получаю ошибку конфликтующих типов:
make all-am
make[1]: Entering directory `/c/Users/Pawan/Downloads/Compressed/libpthread-stubs-0.3/libpthread-stubs-0.3'
/bin/sh ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -g -O2 -MT stubs.lo -MD -MP -MF .deps/stubs.Tpo -c -o stubs.lo stubs.c
libtool: compile: gcc -DHAVE_CONFIG_H -I. -g -O2 -MT stubs.lo -MD -MP -MF .deps/stubs.Tpo -c stubs.c -DDLL_EXPORT -DPIC -o .libs/stubs.o
stubs.c:36:5: error: conflicting types for 'pthread_self'
int pthread_self() __attribute__ ((weak, alias ("__pthread_zero_stub")));
^
In file included from stubs.c:29:0:
c:\mingw\include\pthread.h:955:37: note: previous declaration of 'pthread_self' was here
PTW32_DLLPORT pthread_t PTW32_CDECL pthread_self (void);
^
stubs.c:153:5: error: conflicting types for 'pthread_exit'
int pthread_exit() __attribute__ ((weak, alias ("__pthread_exit_stub")));
^
In file included from stubs.c:29:0:
c:\mingw\include\pthread.h:950:32: note: previous declaration of 'pthread_exit' was here
PTW32_DLLPORT void PTW32_CDECL pthread_exit (void *value_ptr);
^
stubs.c:162:5: warning: 'pthread_equal' redeclared without dllimport attribute: previous dllimport ignored [-Wattributes]
int pthread_equal() __attribute__ ((weak, alias ("__pthread_equal_stub")));
^
stubs.c: In function '__pthread_equal_stub':
stubs.c:187:16: error: invalid operands to binary == (have 'pthread_t' and 'pthread_t')
return (t1 == t2);
^
make[1]: *** [stubs.lo] Error 1
make[1]: Leaving directory `/c/Users/Pawan/Downloads/Compressed/libpthread-stubs-0.3/libpthread-stubs-0.3'
make: *** [all] Error 2
Теперь, когда я комментирую #include <pthread.h>
в верхней части файла и положить его внутрь ifndef
(потому что, если я не получаю, я получаю ошибку: error: unknown type name 'pthread_t'
что очевидно) я получаю ту же ошибку, что и выше:
#ifdef NEED_EQUAL_STUB
#include <pthread.h>
static int __pthread_equal_stub(pthread_t t1, pthread_t t2)
{
return (t1 == t2);
}
#endif
Изменить: код файла Stubs.c
#define HAVE_STRUCT_TIMESPEC
//#include <pthread.h>
#include <stdlib.h>
#include "config.h"
#ifndef HAVE_PTHREAD_SELF
#define NEED_ZERO_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_self() __attribute__ ((weak, alias ("__pthread_zero_stub")));
# else
# pragma weak pthread_self = __pthread_zero_stub
# endif
#endif
#ifndef HAVE_PTHREAD_MUTEX_INIT
#define NEED_ZERO_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_mutex_init() __attribute__ ((weak, alias ("__pthread_zero_stub")));
# else
# pragma weak pthread_mutex_init = __pthread_zero_stub
# endif
#endif
#ifndef HAVE_PTHREAD_MUTEX_DESTROY
#define NEED_ZERO_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_mutex_destroy() __attribute__ ((weak, alias ("__pthread_zero_stub")));
# else
# pragma weak pthread_mutex_destroy = __pthread_zero_stub
# endif
#endif
#ifndef HAVE_PTHREAD_MUTEX_LOCK
#define NEED_ZERO_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_mutex_lock() __attribute__ ((weak, alias ("__pthread_zero_stub")));
# else
# pragma weak pthread_mutex_lock = __pthread_zero_stub
# endif
#endif
#ifndef HAVE_PTHREAD_MUTEX_UNLOCK
#define NEED_ZERO_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_mutex_unlock() __attribute__ ((weak, alias ("__pthread_zero_stub")));
# else
# pragma weak pthread_mutex_unlock = __pthread_zero_stub
# endif
#endif
#ifndef HAVE_PTHREAD_COND_INIT
#define NEED_ZERO_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_cond_init() __attribute__ ((weak, alias ("__pthread_zero_stub")));
# else
# pragma weak pthread_cond_init = __pthread_zero_stub
# endif
#endif
#ifndef HAVE_PTHREAD_COND_DESTROY
#define NEED_ZERO_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_cond_destroy() __attribute__ ((weak, alias ("__pthread_zero_stub")));
# else
# pragma weak pthread_cond_destroy = __pthread_zero_stub
# endif
#endif
#ifndef HAVE_PTHREAD_CONDATTR_INIT
#define NEED_ZERO_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_condattr_init() __attribute__ ((weak, alias ("__pthread_zero_stub")));
# else
# pragma weak pthread_condattr_init = __pthread_zero_stub
# endif
#endif
#ifndef HAVE_PTHREAD_CONDATTR_DESTROY
#define NEED_ZERO_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_condattr_destroy() __attribute__ ((weak, alias ("__pthread_zero_stub")));
# else
# pragma weak pthread_condattr_destroy = __pthread_zero_stub
# endif
#endif
#ifndef HAVE_PTHREAD_COND_WAIT
#define NEED_ABORT_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_cond_wait() __attribute__ ((weak, alias ("__pthread_abort_stub")));
# else
# pragma weak pthread_cond_wait = __pthread_abort_stub
# endif
#endif
#ifndef HAVE_PTHREAD_COND_TIMEDWAIT
#define NEED_ABORT_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_cond_timedwait() __attribute__ ((weak, alias ("__pthread_abort_stub")));
# else
# pragma weak pthread_cond_timedwait = __pthread_abort_stub
# endif
#endif
#ifndef HAVE_PTHREAD_COND_SIGNAL
#define NEED_ZERO_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_cond_signal() __attribute__ ((weak, alias ("__pthread_zero_stub")));
# else
# pragma weak pthread_cond_signal = __pthread_zero_stub
# endif
#endif
#ifndef HAVE_PTHREAD_COND_BROADCAST
#define NEED_ZERO_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_cond_broadcast() __attribute__ ((weak, alias ("__pthread_zero_stub")));
# else
# pragma weak pthread_cond_broadcast = __pthread_zero_stub
# endif
#endif
#ifndef HAVE_PTHREAD_EXIT
#define NEED_EXIT_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_exit() __attribute__ ((weak, alias ("__pthread_exit_stub")));
# else
# pragma weak pthread_exit = __pthread_exit_stub
# endif
#endif
#ifndef HAVE_PTHREAD_EQUAL
#define NEED_EQUAL_STUB
# ifdef SUPPORT_ATTRIBUTE_ALIAS
int pthread_equal() __attribute__ ((weak, alias ("__pthread_equal_stub")));
# else
# pragma weak pthread_equal = __pthread_equal_stub
# endif
#endif
#ifdef NEED_ZERO_STUB
static int __pthread_zero_stub()
{
return 0;
}
#endif
#ifdef NEED_ABORT_STUB
static int __pthread_abort_stub()
{
abort();
}
#endif
#ifdef NEED_EQUAL_STUB
//#define HAVE_STRUCT_TIMESPEC
#include <pthread.h>
static int __pthread_equal_stub(pthread_t t1, pthread_t t2)
{
return (t1 == t2);
}
#endif
#ifdef NEED_EXIT_STUB
static void __pthread_exit_stub(void *ret)
{
exit(EXIT_SUCCESS);
}
#endif
1 ответ
Я не могу воспроизвести вашу ошибку, но (думаю) успешно установил libpthreads-stubs-0.3. Я использую 64-битную версию msys и mingw.
Я скачал libpthreads-stubs-0.3 с этого сайта, использовал tar -xzf, чтобы распаковать его в мою домашнюю папку в msys, cd'd в папку и сделал ./configure --prefix=/usr
затем make
затем make install
,
У меня когда-то был error: conflicting types for ...
а также error: previous declaration for ...
и это было потому, что я включил pthreads.h mingw в одном месте и другую версию pthreads.h для Windows в другом месте.
Если ничего не помогает, попробуйте начать заново с установки mingw и libpthreads-stubs-0.3.