Je viens d’installer une Debian etch dont voici quelques caractéristiques !
$ uname -a
Linux debian 2.6.18-3-686 #1 SMP Mon Dec 4 16:41:14 UTC 2006 i686 GNU/Linux
$ gcc -v
Utilisation des specs internes.
Target: i486-linux-gnu
Configuré avec: ../src/configure -v --enable-languages=c,c++,fortran,objc,obj-c++,treelang -- prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gette xt --enable-threads=posix --enable-nls --program-suffix=-4.1 --enable-__cxa_atexit --enable-c locale=gnu --enable-libstdcxx-debug --enable-mpfr --with-tune=i686 --enable-checking=release i486-linux-gnu
Modèle de thread: posix
version gcc 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
J’ai essayé vainement de compiler xine-lib à cause d’un problème sur les pthread. Alors
j’ai fait un test avec les exemples du chapitre 12 du livre "Programmation système en C sous
linux de C. Blaess et je suis tombé sur la même erreur de compilation. Lorsque #include <pthread.h>
précède #include <stdlib.h>, la compilation réussit. Voici le source de l’exemple :
/***********************************************************************\
exemple_create
Programme d'exemple du livre "Developpement systeme en C sous Linux"
(c) 2000,2005 - Christophe Blaess
\***********************************************************************/
#define _XOPEN_SOURCE 500
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define NB_THREADS 5
void * fn_thread (void * numero);
static int compteur = 0;
int
main (void)
{
pthread_t thread[NB_THREADS];
int i;
int ret;
for (i = 0; i < NB_THREADS; i ++)
if ((ret = pthread_create (& thread[i],
NULL,
fn_thread,
(void *) i)) != 0) {
fprintf(stderr, "%d : %s", i, strerror(ret));
exit(EXIT_FAILURE);
}
while (compteur < 40) {
fprintf(stdout, "main : compteur = %d\n", compteur);
sleep(1);
}
for (i = 0; i < NB_THREADS; i ++)
pthread_join(thread[i], NULL);
return EXIT_SUCCESS;
}
void *
fn_thread (void * num)
{
int numero = (int) num;
while (compteur < 40) {
usleep(numero * 100000);
compteur ++;
fprintf(stdout, "Thread %d : compteur = %d\n", numero, compteur);
}
pthread_exit(NULL);
}
La compilation réussit :
$ make exemple_create
cc -Wall -pedantic -g -pthread exemple_create.c -o exemple_create
exemple_create.c: In function 'fn_thread':
exemple_create.c:61: attention : control reaches end of non-void function
En mettant la ligne #include <pthread.h> après #include <stdlib.h>, la
compilation échoue. Voici les messages :
$ make exemple_create
cc -Wall -pedantic -g -pthread exemple_create.c -o exemple_create
In file included from exemple_create.c:13:
/usr/include/pthread.h:285: erreur: conflicting types for 'pthread_t'
/usr/include/bits/pthreadtypes.h:152: erreur: previous declaration of 'pthread_t' was here
/usr/include/pthread.h:286: erreur: conflicting types for 'pthread_attr_t'
/usr/include/bits/pthreadtypes.h:54: erreur: previous declaration of 'pthread_attr_t' was here
/usr/include/pthread.h:287: erreur: conflicting types for 'pthread_key_t'
/usr/include/bits/pthreadtypes.h:82: erreur: previous declaration of 'pthread_key_t' was here
/usr/include/pthread.h:289: erreur: conflicting types for 'pthread_mutexattr_t'
/usr/include/bits/pthreadtypes.h:102: erreur: previous declaration of 'pthread_mutexattr_t' was here
/usr/include/pthread.h:290: erreur: conflicting types for 'pthread_mutex_t'
/usr/include/bits/pthreadtypes.h:95: erreur: previous declaration of 'pthread_mutex_t' was here
/usr/include/pthread.h:291: erreur: conflicting types for 'pthread_condattr_t'
/usr/include/bits/pthreadtypes.h:79: erreur: previous declaration of 'pthread_condattr_t' was here
/usr/include/pthread.h:292: erreur: conflicting types for 'pthread_cond_t'
/usr/include/bits/pthreadtypes.h:72: erreur: previous declaration of 'pthread_cond_t' was here
/usr/include/pthread.h:293: erreur: conflicting types for 'pthread_rwlockattr_t'
/usr/include/bits/pthreadtypes.h:128: erreur: previous declaration of 'pthread_rwlockattr_t' was here
/usr/include/pthread.h:294: erreur: conflicting types for 'pthread_rwlock_t'
/usr/include/bits/pthreadtypes.h:120: erreur: previous declaration of 'pthread_rwlock_t' was here
exemple_create.c: In function 'fn_thread':
exemple_create.c:61: attention : control reaches end of non-void function
make: *** [exemple_create] Erreur 1
Dans le cas des applis que je veux compiler (xine-lib, xine-ui, vdr, vdr-plugin-xine), j’ai essayé de
mettre systématiquement le #include <pthread.h> en tête des fichiers, mais il y a plus de 100 fichiers
à modifier, alors j’ai abandonné, car il y a surement une solution moins bestiale.
Je pense qu’il y a un problème dans mon installation qui est pourtant récente (moins de 2 mois).
J’ai parcouru les forums pour m’apercevoir que ce problème est souvent signalé, mais aucune
explication ou réponse n’est donnée, en dehors du conseil de mettre le #include <pthread.h> avant
le #include <stdlib.h>.
J’ai demandé son avis à Christophe Blaess par mail. Il émet l’hypothèse d’une erreur dans des fichiers
d’en-tête de la GlibC utilisée par cette version de la distribution. J’ai regardé le fichier
/usr/include/features.h, mais c’est au delà de mes compétences.
Avez-vous une idée sur l’origine de ce problème et la manière de le contourner ?
Cordialement, Michel.