J'utilise diverses fonctions stdlib comme srand (), etc. J'ai la ligne
#include <stdlib.h>
au sommet de mon code.
J'ai entré ceci sur la ligne de commande:
# find / -name stdlib.h
find: `/home/dmurvihill/.gvfs: permission denied
/usr/include/stdlib.h
/usr/include/bits/stdlib.h
Donc, stdlib.h est clairement dans/usr/include.
Mon préprocesseur:
# gcc -print-prog-name=cc1
/usr/libexec/gcc/x86_64-redhat-linux/4.5.1/cc1
Chemin de recherche par défaut de mon préprocesseur:
# /usr/libexec/gcc/x86_64-redhat-linux/4.5.1/cc1 -v
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.5.1/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/include
/usr/include
End of search list.
Donc, stdlib.h est clairement dans/usr/include, ce qui est très certainement supposé être recherché par mon préprocesseur, mais je reçois toujours cette erreur!
/path/to/cpa_sample_code_main.c:15:20: fatal error: stdlib.h: No such file or directory
compilation terminated
Mettre à jour
Un programme que j'ai écrit pour tester ce code:
#include <stdio.h>
#include <stdlib.h>
#include <linux/time.h>
int main()
{
printf("Hello, World!\n");
printf("Getting time...\n");
time_t seconds;
time(&seconds);
printf("Seeding generator...\n");
srand((unsigned int)seconds);
printf("Getting random number...\n");
int value = Rand();
printf("It is %d!",value);
printf("Goodbye, cruel world!");
return 0;
}
La commande
gcc -H -v -fsyntax-only stdlib_test.c
sortie
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.5.1/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --enable-languages=c,c++,objc,obj-c++,Java,fortran,ada,lto --enable-plugin --enable-Java-awt=gtk --disable-dssi --with-Java-home=/usr/lib/jvm/Java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-Java-maintainer-mode --with-ecj-jar=/usr/share/Java/Eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-Arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC)
COLLECT_GCC_OPTIONS='-H' '-v' '-fsyntax-only' '-mtune=generic' '-march=x86-64'
/usr/libexec/gcc/x86_64-redhat-linux/4.5.1/cc1 -quiet -v -H /CRF_Verify/stdlib_test.c -quiet -dumpbase stdlib_test.c -mtune=generic -march=x86-64 -auxbase stdlib_test -version -fsyntax-only -o /dev/null
GNU C (GCC) version 4.5.1 20100924 (Red Hat 4.5.1-4) (x86_64-redhat-linux)
compiled by GNU C version 4.5.1 20100924 (Red Hat 4.5.1-4), GMP version 4.3.1, MPFR version 2.4.2, MPC version 0.8.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.5.1/include-fixed"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-redhat-linux/4.5.1/../../../../x86_64-redhat-linux/include"
#include "..." search starts here:
#include <...> search starts here:
/usr/local/include
/usr/lib/gcc/x86_64-redhat-linux/4.5.1/include
/usr/include
End of search list.
GNU C (GCC) version 4.5.1 20100924 (Red Hat 4.5.1-4) (x86_64-redhat-linux)
compiled by GNU C version 4.5.1 20100924 (Red Hat 4.5.1-4), GMP version 4.3.1, MPFR version 2.4.2, MPC version 0.8.1
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: ea394b69293dd698607206e8e43d607e
. /usr/include/stdio.h
.. /usr/include/features.h
... /usr/include/sys/cdefs.h
.... /usr/include/bits/wordsize.h
... /usr/include/gnu/stubs.h
.... /usr/include/bits/wordsize.h
.... /usr/include/gnu/stubs-64.h
.. /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stddef.h
.. /usr/include/bits/types.h
... /usr/include/bits/wordsize.h
... /usr/include/bits/typesizes.h
.. /usr/include/libio.h
... /usr/include/_G_config.h
.... /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stddef.h
.... /usr/include/wchar.h
... /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stdarg.h
.. /usr/include/bits/stdio_lim.h
.. /usr/include/bits/sys_errlist.h
. /usr/include/stdlib.h
.. /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stddef.h
.. /usr/include/bits/waitflags.h
.. /usr/include/bits/waitstatus.h
... /usr/include/endian.h
.... /usr/include/bits/endian.h
.... /usr/include/bits/byteswap.h
..... /usr/include/bits/wordsize.h
.. /usr/include/sys/types.h
... /usr/include/time.h
... /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stddef.h
... /usr/include/sys/select.h
.... /usr/include/bits/select.h
..... /usr/include/bits/wordsize.h
.... /usr/include/bits/sigset.h
.... /usr/include/time.h
.... /usr/include/bits/time.h
... /usr/include/sys/sysmacros.h
... /usr/include/bits/pthreadtypes.h
.... /usr/include/bits/wordsize.h
.. /usr/include/alloca.h
... /usr/lib/gcc/x86_64-redhat-linux/4.5.1/include/stddef.h
. /usr/include/linux/time.h
.. /usr/include/linux/types.h
... /usr/include/asm/types.h
.... /usr/include/asm-generic/types.h
..... /usr/include/asm-generic/int-ll64.h
...... /usr/include/asm/bitsperlong.h
....... /usr/include/asm-generic/bitsperlong.h
... /usr/include/linux/posix_types.h
.... /usr/include/linux/stddef.h
.... /usr/include/asm/posix_types.h
..... /usr/include/asm/posix_types_64.h
In file included from /CRF_Verify/stdlib_test.c:3:0:
/usr/include/linux/time.h:9:8: error: redefinition of ‘struct timespec’
/usr/include/time.h:120:8: note: originally defined here
/usr/include/linux/time.h:15:8: error: redefinition of ‘struct timeval’
/usr/include/bits/time.h:75:8: note: originally defined here
Multiple include guards may be useful for:
/usr/include/asm/posix_types.h
/usr/include/bits/byteswap.h
/usr/include/bits/endian.h
/usr/include/bits/select.h
/usr/include/bits/sigset.h
/usr/include/bits/stdio_lim.h
/usr/include/bits/sys_errlist.h
/usr/include/bits/time.h
/usr/include/bits/typesizes.h
/usr/include/bits/waitflags.h
/usr/include/bits/waitstatus.h
/usr/include/gnu/stubs-64.h
/usr/include/gnu/stubs.h
/usr/include/wchar.h
Votre erreur semble provenir de l'inclusion de linux/time.h
lorsque vous essayez également d'inclure stdlib.h
. linux/time.h
est un en-tête de noyau et ne doit être utilisé que dans le code du noyau. stdlib.h
est une fonction utilisateur-land et ne doit être utilisé que dans des programmes utilisateur. Si vous remarquez l'erreur, vous obtenez:
/usr/include/linux/time.h:12: error: redefinition of 'struct timespec'
/usr/include/linux/time.h:18: error: redefinition of 'struct timeval'
vous pouvez voir que vous obtenez une erreur liée à cela. Comme vous le voyez dans votre trace longue, cela est dû au fait que stdlib.h
inclut time.h
(celui dans /usr/include
et non pas /usr/include/linux
). J'imagine que c'est la cause réelle de l'erreur que vous voyez à propos de ne pas trouver stdlib.h (bien que je ne puisse imaginer les détails de la façon dont les erreurs se produisent telles qu'elles sont).
Pour tous ceux qui ont atterri ici en essayant de compiler un programme C++ avec Cygwin sous Windows, mon problème était que j’avais à la fois MingW et Cygwin. MingW a été installé dans le cadre de la configuration de Cygwin. J'ai utilisé le setup.exe
(appelons-le installateur de paquet) de Cygwin et supprimé toutes les instances de MingW. Après cela, mon application de test a été compilée correctement.
Note : Cette solution est ce qui a fonctionné pour moi. Il y a beaucoup d'autres raisons pour lesquelles vous avez la même erreur.
J'ai trouvé une autre cause en utilisant g ++ v6.x, bug 70129 . Je l'ai déclenché en spécifiant -isystem
(via le mot clé SYSTEM
de CMake) pour un répertoire d'inclusion Boost - qui incluait finalement cstdlib
.