2011-08-01 65 views
13

estoy usando diversas funciones como stdlib srand(), etc. Tengo la líneastdlib.h: No existe el fichero o directorio

#include <stdlib.h> 

en la parte superior de mi código.

entré en este en la línea de comandos:

# find/-name stdlib.h 

find: `/home/dmurvihill/.gvfs: permission denied 
/usr/include/stdlib.h 
/usr/include/bits/stdlib.h 

Así, stdlib.h es claramente en/usr/include.

Mi preprocesador:

# gcc -print-prog-name=cc1 

/usr/libexec/gcc/x86_64-redhat-linux/4.5.1/cc1 

ruta de búsqueda predeterminada de mi preprocesador:

# /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. 

Así, stdlib.h es claramente en/usr/include, que se supone sin duda a ser buscado por mi preprocesador, pero sigo recibiendo este error!

/path/to/cpa_sample_code_main.c:15:20: fatal error: stdlib.h: No such file or directory 
compilation terminated 

actualización

Un programa que escribí para probar este código:

#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; 
} 

El comando

gcc -H -v -fsyntax-only stdlib_test.c 

salida

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 
+4

Huele como si estuviera buscando una ruta de búsqueda en su herramienta de construcción, o es un problema de permiso para mí (¿Por qué no puede acceder a .gvfs? ¿No es el propietario de todos los archivos en su carpeta de inicio?). Intente utilizar una herramienta como 'strace' y recompile de nuevo, verificando si hay errores de acceso a archivos. Amplíe la salida de strace para stdlib.h, asegúrese de que esté mirando donde espera. – Josh

+0

Vuelva a compilar con 'gcc -H -v -fsyntax-only/ruta/a/cpa_sample_code_main.c' y publique la salida COMPLETA, SIN EDITAR, por favor. – zwol

+1

¿nos puede dar el comando de compilación que está utilizando? Por ejemplo, 'gcc -g -o cpa_sample_code ...' – Jason

Respuesta

8

Su error parece provenir de incluir linux/time.h cuando también intenta incluir stdlib.h. linux/time.h es un encabezado de kernel y solo se debe usar en el código kernel. stdlib.h es una función user-land y solo debe usarse en programas de usuario. Si observa el error que obtiene:

/usr/include/linux/time.h:12: error: redefinition of 'struct timespec' 
/usr/include/linux/time.h:18: error: redefinition of 'struct timeval' 

verá que se está produciendo un error relacionado con esto. Como se ve en su rastro largo, esto se debe a que stdlib.h incluye time.h (el de /usr/include, no el de /usr/include/linux). Imagino que esta es la causa real del error que ves al no encontrar stdlib.h (aunque no puedo imaginar los detalles de cómo están ocurriendo los errores).

+1

Bingo. Reemplacé srand con get_random_bytes() de linux/random.h, y ahora funciona como un amuleto. Soy nuevo en la programación de espacio del núcleo, y no me había dado cuenta de que TODAS las bibliotecas estándar no estaban disponibles (lo que explica las etiquetas -nostdinc). ¡Gracias por toda la ayuda, a todos! –

1

Para cualquier persona que aterrizó aquí tratando de compilar un programa en C++ con Cygwin en Windows, mi problema era que tenía tanto MingW y Cygwin. MingW se instaló como parte de la configuración de Cygwin. Usé el setup.exe (llamémoslo instalador de paquetes) de Cygwin y eliminamos todas las instancias de MingW. Después de eso, mi aplicación de prueba compiló correctamente.

Nota: Esta solución es lo que funcionó para mí. Hay miles de otras razones por las cuales tienes el mismo error.

0

He encontrado otra causa al usar g ++ v6.x, bug 70129.Lo activé al especificar -isystem (a través de la palabra clave SYSTEM de CMake) para un directorio de inclusión de Boost, que finalmente incluyó cstdlib.

Cuestiones relacionadas