[Resolu] Conflit entre thread.h et pthreadtype.h

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.

pourquoi as-tu deux fois
#include <stdio.h>
:question:

Tu as essayé bêtement de mettre un #include <pthread.h> dans <stdlib.h> ?

Le problème n’est pas si simple. Les compilations réussisent lorsque
pthread.h est inclus avant bits/pthreadtypes.h. Si on regarde dans
/usr/include quels sont le *.h qui incluent bits/pthreadtypes.h, on
trouve :

sys/types.h:266:# include <bits/pthreadtypes.h>
signal.h:386:# include <bits/pthreadtypes.h>
nptl/pthread.h:28:#include <bits/pthreadtypes.h>

Il semble donc qu’il faille que pthread.h soit inclut avant sys/types.h, mais
si on regarde qui inclut sys/types.h on trouve :

xine/os_types.h:46:#  include <sys/types.h>
xine/os_types.h:58:#  include <sys/types.h>
xine/buffer.h:47:#include <sys/types.h>
xine/input_plugin.h:26:#include <sys/types.h>
stdlib.h:433:# include <sys/types.h>    /* we need int32_t... */
sys/mtio.h:26:#include <sys/types.h>
sys/quota.h:41:#include <sys/types.h>
sys/bitypes.h:3:#include <sys/types.h>
sys/gmon.h:37:#include <sys/types.h>
sys/uio.h:24:#include <sys/types.h>
sys/xattr.h:23:#include <sys/types.h>
sys/profil.h:25:#include <sys/types.h>
sys/acct.h:26:#include <sys/types.h>
sys/epoll.h:23:#include <sys/types.h>
sys/sendfile.h:24:#include <sys/types.h>
sys/ustat.h:29:#include <sys/types.h>
sys/fsuid.h:23:#include <sys/types.h>
sys/procfs.h:33:#include <sys/types.h>
sys/param.h:42:#include <sys/types.h>
pthread.h:111:#include <sys/types.h>     /* for ssize_t         */
fontconfig/fontconfig.h:28:#include <sys/types.h>
dialog.h:33:#include <sys/types.h>
aliases.h:24:#include <sys/types.h>
gcrypt.h:30:#include <sys/types.h>
pngconf.h:296:#  include <sys/types.h>
resolv.h:56:#include <sys/types.h>
netinet/icmp6.h:24:#include <sys/types.h>
netinet/ip.h:23:#include <sys/types.h>
netinet/tcp.h:54:# include <sys/types.h>
netinet/if_tr.h:23:#include <sys/types.h>
netinet/udp.h:52:#include <sys/types.h>
netinet/if_fddi.h:23:#include <sys/types.h>
netinet/ip_icmp.h:23:#include <sys/types.h>
netinet/in_systm.h:24:#include <sys/types.h>
netinet/igmp.h:23:#include <sys/types.h>
netinet/if_ether.h:23:#include <sys/types.h>
icc34.h:222:#include <sys/types.h>
linux/types.h:6:# include <sys/types.h>
linux/input.h:18:#include <sys/types.h>
linux/coda.h:66:#include <sys/types.h>
aio.h:30:#include <sys/types.h>
audio/Aos.h:63:#include <sys/types.h>                   /* forgot to protect it... */
audio/Aos.h:69:#include <sys/types.h>
audio/Aos.h:72:#include <sys/types.h>
audio/audiolib.h:52:#include <sys/types.h>                              /* forgot to protect it... */
audio/audiolib.h:58:#include <sys/types.h>
audio/audiolib.h:61:#include <sys/types.h>
X11/Xpoll.h:86:# include <sys/types.h>
X11/Xos_r.h:567:# include <sys/types.h>
X11/Xlib.h:43:#include <sys/types.h>                    /* forgot to protect it... */
X11/Xlib.h:49:#include <sys/types.h>
X11/Xlib.h:52:#include <sys/types.h>
X11/Xtrans/Xtransutil.c:507:#include <sys/types.h>
X11/Xtrans/Xtranslcl.c:92:#include <sys/types.h>
X11/Xos.h:51:#include <sys/types.h>                     /* forgot to protect it... */
X11/Xos.h:57:#include <sys/types.h>
X11/Xos.h:60:# include <sys/types.h>
X11/Xarch.h:53:#include <sys/types.h>
X11/extensions/lbxopts.h:79:#include <sys/types.h>
lcms.h:135:#  include <sys/types.h>
rpc/types.h:68:#include <sys/types.h>
rpc/pmap_rmt.h:42:#include <sys/types.h>
rpc/auth_unix.h:49:#include <sys/types.h>
rpc/clnt.h:41:#include <sys/types.h>
rpc/rpc_des.h:38:#include <sys/types.h>
rpc/xdr.h:40:#include <sys/types.h>
vdr/filter.h:13:#include <sys/types.h>
vdr/thread.h:15:#include <sys/types.h>
vdr/tools.h:23:#include <sys/types.h>
vdr/libsi/util.h:17:#include <sys/types.h>
qt3/private/qsharedmemory_p.h:54:#include <sys/types.h>
zconf.h:288:#  include <sys/types.h> /* for off_t */
nptl/semaphore.h:23:#include <sys/types.h>
nptl/thread_db.h:28:#include <sys/types.h>
gnutls/gnutls.h:59:#include <sys/types.h>
libpng/pngconf.h:296:#  include <sys/types.h>
netipx/ipx.h:24:#include <sys/types.h>
libpng12/pngconf.h:296:#  include <sys/types.h>
ftw.h:28:#include <sys/types.h>
spawn.h:26:#include <sys/types.h>
link.h:27:#include <sys/types.h>
semaphore.h:19:#include <sys/types.h>
xine.h:48:#include <sys/types.h>
utmp.h:24:#include <sys/types.h>
bits/fcntl.h:26:#include <sys/types.h>
bits/sem.h:23:#include <sys/types.h>
bits/uio.h:24:#include <sys/types.h>
bits/ustat.h:23:#include <sys/types.h>
bits/socket.h:32:#include <sys/types.h>
bits/utmp.h:27:#include <sys/types.h>
protocols/rwhod.h:35:#include <sys/types.h>
protocols/talkd.h:53:#include <sys/types.h>
net/if.h:26:# include <sys/types.h>
net/route.h:26:#include <sys/types.h>
net/ethernet.h:26:#include <sys/types.h>
net/if_shaper.h:23:#include <sys/types.h>
net/if_arp.h:28:#include <sys/types.h>
net/if_ppp.h:51:#include <sys/types.h>
regex.h:25:#include <sys/types.h>
fts.h:36:#include <sys/types.h>
thread_db.h:28:#include <sys/types.h>
arpa/nameser.h:60:# include <sys/types.h>
mqueue.h:24:#include <sys/types.h>
libtasn1.h:36:#include <sys/types.h>
cups/http.h:37:#  include <sys/types.h>
cups/file.h:38:#  include <sys/types.h>

soit 106 fichiers dans mon cas. Dans le cas d’une grosse appli de
plusieurs centaines de *.c, il ne me reste qu’à inclure systématiquement
pthread.h à la première ligne de chaque fichier. C’est faisable, mais il y
a surement une méthode plus élégante.

Voici un test plus simple que celui mis dans mon premier post. Source de foo.c :

#include <sys/types.h>
#include <pthread.h>
extern int puts (__const char *__s);
int main (void) { puts("Coucou !"); return 0;}

Compilation avec gcc-3.4 :

$ /usr/bin/gcc-3.4 -Wall -pthread  foo.c   -o foo
In file included from foo.c:2:
/usr/include/pthread.h:285: erreur: types conflictuels pour « pthread_t »
/usr/include/bits/pthreadtypes.h:152: erreur: déclaration précédente de « pthread_t » était ici
/usr/include/pthread.h:286: erreur: types conflictuels pour « pthread_attr_t »
/usr/include/bits/pthreadtypes.h:54: erreur: déclaration précédente de « pthread_attr_t » était ici
/usr/include/pthread.h:287: erreur: types conflictuels pour « pthread_key_t »
/usr/include/bits/pthreadtypes.h:82: erreur: déclaration précédente de « pthread_key_t » était ici
/usr/include/pthread.h:289: erreur: types conflictuels pour « pthread_mutexattr_t »
/usr/include/bits/pthreadtypes.h:102: erreur: déclaration précédente de « pthread_mutexattr_t » était ici
/usr/include/pthread.h:290: erreur: types conflictuels pour « pthread_mutex_t »
/usr/include/bits/pthreadtypes.h:95: erreur: déclaration précédente de « pthread_mutex_t » était ici
/usr/include/pthread.h:291: erreur: types conflictuels pour « pthread_condattr_t »
/usr/include/bits/pthreadtypes.h:79: erreur: déclaration précédente de « pthread_condattr_t » était ici
/usr/include/pthread.h:292: erreur: types conflictuels pour « pthread_cond_t »
/usr/include/bits/pthreadtypes.h:72: erreur: déclaration précédente de « pthread_cond_t » était ici

avec gcc-4.1 :

$ /usr/bin/gcc-4.1 -Wall -pthread  foo.c   -o foo
In file included from foo.c:2:
/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

Modification du fichier. pthread.h est mis avant sys/types.h :

#include <pthread.h>
#include <sys/types.h>
extern int puts (__const char *__s);
int main (void) { puts("Coucou !"); return 0;}

Compilation et exécution :

$ /usr/bin/gcc-4.1 -Wall -pthread  foo.c   -o foo
$ ./foo
Coucou !
$ /usr/bin/gcc-3.4 -Wall -pthread  foo.c   -o foo
$ ./foo
Coucou !

Il y a surement un problème dans un ou plusieurs fichiers de configuration de ma distribution.
Quel que soit le source compilé, avec ou sans option -pthread, si par le jeu des includes le
fichier pthread.h est inclus après bits/phtreadtypes.h, il y a erreur de compilation. Le
mécanisme évitant ce conflit (que je ne connais pas) est défaillant dans ma distribution.
Une recherche sur la toile avec “conflicting types for ‘pthread_t’” montre que ce problème
est souvent signalé, et reste toujours sans réponse sur le fond.

Quelqu’un aurait-il une idée ??

/usr/include/bits/pthreadtypes.h est dans le paquet libdevel/libc6-dev, d’aprés packages.debian.org
par contre /usr/include/pthread.h peut aussi être dans libdevel/libpthread-dev
si je cherche juste
pthreadtypes.h je m’aperçois qu’il peut être présent dans 4 paquets de développements diffèrents:
packages.debian.org/cgi-bin/sear … earchfiles
tu es sûr d’avoir pris la bonne bibliothèque.
Es tu à jour sur tes paquets ?

En examinant de près ta recherche, je vois que les deux includes en conflit
proviennent tous les deux du paquet libc6-dev qui est a priori à jour dans
mon installation. Voici mon source.list

# deb cdrom:[Debian GNU/Linux testing _Etch_ - Official Snapshot i386 DVD Binary-1 20070122-09:12]/ etch contrib main

deb http://security.debian.org/ etch/updates main contrib
deb-src http://security.debian.org/ etch/updates main contrib

deb http://ftp.fr.debian.org/debian etch main contrib non-free
deb-src http://ftp.fr.debian.org/debian etch main contrib non-free

et voici le résulte d’un apt-get update et de la tentative de rafraissement
de libc6-dev.

debian:/home/michel# apt-get update
Réception de : 1 http://ftp.fr.debian.org etch Release.gpg [189B]
Atteint http://ftp.fr.debian.org etch Release
Réception de : 2 http://security.debian.org etch/updates Release.gpg [189B]
Atteint http://ftp.fr.debian.org etch/main Packages/DiffIndex
Atteint http://security.debian.org etch/updates Release
Atteint http://ftp.fr.debian.org etch/contrib Packages/DiffIndex
Ign http://security.debian.org etch/updates/main Packages/DiffIndex
Atteint http://ftp.fr.debian.org etch/non-free Packages/DiffIndex
Ign http://security.debian.org etch/updates/contrib Packages/DiffIndex
Ign http://security.debian.org etch/updates/main Sources/DiffIndex
Atteint http://ftp.fr.debian.org etch/main Sources/DiffIndex
Ign http://security.debian.org etch/updates/contrib Sources/DiffIndex
Atteint http://security.debian.org etch/updates/main Packages
Atteint http://ftp.fr.debian.org etch/contrib Sources/DiffIndex
Atteint http://security.debian.org etch/updates/contrib Packages
Atteint http://ftp.fr.debian.org etch/non-free Sources/DiffIndex
Atteint http://security.debian.org etch/updates/main Sources
Atteint http://security.debian.org etch/updates/contrib Sources
2o réceptionnés en 2s (1o/s)
Lecture des listes de paquets... Fait
debian:/home/michel# apt-get install libc6-dev
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
libc6-dev est déjà la plus récente version disponible.
0 mis à jour, 0 nouvellement installés, 0 à enlever et 107 non mis à jour.

Je nage !!!

Voici un exemple simplifié à partir de exemple_create.c de C. Blaess :

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>

void * fn_thread (void * numero);

static int compteur = 0;

int main (void)
{
pthread_t thread;
int       ret;
int       arg = 123;
void      *retour;

 		fprintf(stdout, "Thread creation by main\n");   
		if ((ret = pthread_create (& thread, NULL, fn_thread, (void *) &arg)) != 0) 
      {
			fprintf(stderr, "Thread creation failure, ret = %d\n", ret);
			exit(1);
		}

	   while (compteur < 3) 
      {
		   fprintf(stdout, "Count in main = %d\n", compteur);
		   sleep(1);
      }   

      fprintf(stdout, "Main waits the end of the thread\n");   	   
		pthread_join(thread, &retour);

	return 0;
}

void *fn_thread (void * parg)
{
int arg = *(int *)parg;

	fprintf(stdout, "Value received by the thread from main : %d\n", arg);     
	while (compteur < 5) 
   {
		usleep(500000);
		compteur ++;
		fprintf(stdout, "Count in thread = %d\n", compteur);
	}
	fprintf(stdout, "End of the thread\n");     
	return NULL;
}

Compilation puis exécution :

$make exemple_create
cc -Wall -pedantic -g -pthread    exemple_create.c   -o exemple_create
michel@debian:~/blaess/chap12$ ./exemple_c
bash: ./exemple_c: Aucun fichier ou répertoire de ce type
$ ./exemple_create
Thread creation by main
Count in main = 0
Value received by the thread from main : 123
Count in thread = 1
Count in main = 1
Count in thread = 2
Count in thread = 3
Main waits the end of the thread
Count in thread = 4
Count in thread = 5
End of the thread

Je supprime la ligne #include <pthread.h>. La compilation marche mais l’exécution
fait n’importe quoi (le treadh est créé mais n’est pas activé). J’arrete l’exécution
par CTRL+C.

$make exemple_create
cc -Wall -pedantic -g -pthread    exemple_create.c   -o exemple_create
exemple_create.c: In function 'main':
exemple_create.c:17: attention : implicit declaration of function 'pthread_create'
exemple_create.c:26: attention : implicit declaration of function 'sleep'
exemple_create.c:30: attention : implicit declaration of function 'pthread_join'
exemple_create.c: In function 'fn_thread':
exemple_create.c:42: attention : implicit declaration of function 'usleep'
$ ./exemple_create
Thread creation by main
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0
Count in main = 0

Je remet la ligne #include <pthread.h> et supprime la ligne #include <stdlib.h>.
La compilation se fait et l’exécution est correcte :

$ make exemple_create
cc -Wall -pedantic -g -pthread    exemple_create.c   -o exemple_create
exemple_create.c: In function 'main':
exemple_create.c:20: attention : implicit declaration of function 'exit'
exemple_create.c:20: attention : incompatible implicit declaration of built-in function 'exit'
$ ./exemple_create
Thread creation by main
Count in main = 0
Value received by the thread from main : 123
Count in thread = 1
Count in thread = 2
Count in main = 2
Count in thread = 3
Count in thread = 4
Main waits the end of the thread
Count in thread = 5
End of the thread

Je supprime les deux includes (pthread.h et stdlib.h). Normal, la compilation échoue :

$ make exemple_create
cc -Wall -pedantic -g -pthread    exemple_create.c   -o exemple_create
exemple_create.c: In function 'main':
exemple_create.c:11: erreur: 'pthread_t' undeclared (first use in this function)
exemple_create.c:11: erreur: (Each undeclared identifier is reported only once
exemple_create.c:11: erreur: for each function it appears in.)
exemple_create.c:11: erreur: expected ';' before 'thread'
exemple_create.c:12: attention : ISO C90 forbids mixed declarations and code
exemple_create.c:17: attention : implicit declaration of function 'pthread_create'
exemple_create.c:17: erreur: 'thread' undeclared (first use in this function)
exemple_create.c:20: attention : implicit declaration of function 'exit'
exemple_create.c:20: attention : incompatible implicit declaration of built-in function 'exit'
exemple_create.c:26: attention : implicit declaration of function 'sleep'
exemple_create.c:30: attention : implicit declaration of function 'pthread_join'
exemple_create.c: In function 'fn_thread':
exemple_create.c:42: attention : implicit declaration of function 'usleep'
make: *** [exemple_create] Erreur 1

Et bien sur, elle échoue également avec <stdlib.h> avant <pthread.h> :

$ make exemple_create
cc -Wall -pedantic -g -pthread    exemple_create.c   -o exemple_create
In file included from exemple_create.c:2:
/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
make: *** [exemple_create] Erreur 1

Finalement, le code importe peu. Dans mon installation, si dans un source en langage C
<sys/types> est inclut par n’importe quel autre fichier *.h (un parmi les 106 susceptibles
de l’inclure, qui lui meme peut etre inclut par un autre et etc…) avant <pthread.h>, la
compilation échoue. Normalement <bits/pthreadtypes.h> n’est jamais inclut directement, cf
l’avertissement en tete du fichier :

#if !defined _BITS_TYPES_H && !defined _PTHREAD_H
# error "Never include <bits/pthreadtypes.h> directly; use <sys/types.h> instead."
#endif

Il y a une solution dans le style de celle que tu proposes : inclure pthread.h dans sys/types.h
avant qu’il inclut bits/pthreadtypes.h, mais est-ce valable pour toutes les applis ???

Encore plus simple. J’ai mis #include <pthread.h> à la 1ère ligne de
bits/pthreadtypes.h, et je suis reparti dans ma tentative de compilation de la
xine-lib. PLus de conflit entre pthread.h et pthreadtypes.h, mais un nouveau
qui apparait plus loin, entre sys/socket.h et pthread.h :

In file included from /usr/include/sys/socket.h:27,
                 from rtsp.c:29:
/usr/include/sys/uio.h:40: error: conflicting types for '__pthread_readv'
/usr/include/pthread.h:507: error: previous declaration of '__pthread_readv' was here
/usr/include/sys/uio.h:50: error: conflicting types for '__pthread_writev'
/usr/include/pthread.h:508: error: previous declaration of '__pthread_writev' was here
In file included from rtsp.c:29:
/usr/include/sys/socket.h:124: error: conflicting types for '__pthread_connect'
/usr/include/pthread.h:501: error: previous declaration of '__pthread_connect' was here
/usr/include/sys/socket.h:152: error: conflicting types for '__pthread_sendto'
/usr/include/pthread.h:512: error: previous declaration of '__pthread_sendto' was here
/usr/include/sys/socket.h:163: error: conflicting types for '__pthread_recvfrom'
/usr/include/pthread.h:511: error: previous declaration of '__pthread_recvfrom' was here
/usr/include/sys/socket.h:210: error: conflicting types for '__pthread_accept'
/usr/include/pthread.h:502: error: previous declaration of '__pthread_accept' was here

J’abandonne pour le moment !!!

Ecoutes, mon fils étant en train de vandaliser le salon, j’ai un peu de mal à me concentrer sur ce que tu écris mais un truc me turlupine:
ton problême ne peut pas être passé au travers du “filtre qualité” debian,
je ne crois pas que ça vienne d’un problême de programmation,
et tu as 107 paquets en instance de mise à jour.
C’est normal ?
Je me demande si une version ancienne d’un preprocesseur quelconque, ou une lib ancienne ?

Finalement j’ai trouvé la solution sur des forums espagnol et italien :

mldonkey.sourceforge.net/forums/ … hp?p=25299
lists.firenze.linux.it/pipermai … 14692.html

Je ne sais pas quel package a installé libpthread-dev, mais les pthread qu’il installe sont en conflit avec le reste de la distribution. Alors je l’ai désintallé :
$sudo apt-get remove --purge libpthread-dev
et tout est rentré dans l’ordre. :smiley: