¿Dónde está mi directorio / usr / include / sys?

13

Recientemente actualicé de Kubuntu 12.04 a 13.04, una reinstalación completa.

Usando gcc 4.7.3. Compilé algunos programas para descubrir que no hay /usr/include/sysdirectorio. Es decir, types.h, stat.h, etc, están ausentes. Existen en el include/linuxdirectorio pero no include/sys.

¿Que esta pasando?

Pato
fuente
¿Cuál es el mensaje de error que imprime GCC? Por favor, edite la cuestión de proporcionar esta y otra información relacionada con su problema.
edwin
1
¿Tiene instalado Build Essential?
Seth
Los dos programas que he intentado compilan bien, por lo que no hay ningún mensaje de error de gcc. Simplemente no puedo entender de dónde viene el encabezado. Tengo un editor que crea referencias a funciones y syscall y similares, y no estoy contento de que no pueda encontrar el directorio.
Pato
1
Sí, build-essential está actualizado.
Pato

Respuestas:

13

Si usa Ubuntu en 64 bits (no puedo enviar mensajes de texto exactamente ahora en un sistema de 32 bits), entonces el directorio de la pregunta es:

/usr/include/x86_64-linux-gnu/sys

Ahora, con esta información, puede crear enlaces simbólicos a esos archivos si realmente los necesita en esa ubicación ( /usr/include/sys) usando esto en un terminal:

sudo ln -s /usr/include/x86_64-linux-gnu/sys/types.h /usr/include/sys/types.h
sudo ln -s /usr/include/x86_64-linux-gnu/sys/stat.h /usr/include/sys/stat.h

# ...etc
Radu Rădeanu
fuente
Si, 64 bit. Leí algo similar en otra parte y parece que todo está en ese directorio, pero no estoy seguro de cómo se incluyen los encabezados del "#include sys / stat.h" al directorio x86_64 / sys. ¿Es esta una nueva característica de inyección de gcc caído? Por otro lado, no veo enlaces simbólicos o similares que (externamente) conduzcan a este comportamiento.
Pato
Parece que nos cruzamos en el viento. Entonces, la conclusión es que el compilador está haciendo algo de magia, pero es posible que necesite usar algunos hacks de enlaces simbólicos para hacer feliz a mi editor.
Pato
@Duck Acabo de editar mi respuesta antes de 2 minutos de tus comentarios :)
Radu Rădeanu
5

instale libc6-dev-amd64 si está trabajando en un linux de 64 bits. Escriba el siguiente comando en la terminal de ubuntu:

sudo apt-get install libc6-dev-amd64
Nivedita Velagaleti
fuente
1

el directorio sys es un directorio de cabecera del sistema unix / linux con muchos comandos del sistema. Diferentes marcas / versiones de Linux pueden ponerlo en diferentes lugares. El siguiente comando puede ayudarlo:

find /usr/include -type d -name sys
On my ubuntu 16 got the two
/usr/include/bsd/sys
/usr/include/x86_64-linux-gnu/sys

El primero es el hogar de los encabezados del sistema BSD unix.
El segundo es un directorio que contiene cabezas de sistema Linux de 64 bits.

Me encuentro con problemas con cmake no poder encontrar el archivo sys / stat.h. Mi solución temporal es hacer un enlace simbólico

/user/local/include/sys/stat.h from /usr/include/x86_64-linux-gnu/sys/stat.h

No quiero contaminar el directorio / usr / include, y solo estoy haciendo un enlace a un archivo de encabezado en particular y no a todo el directorio sys. Creo que este es un defecto de cmake, por lo que tiene un impacto mínimo al hacer solo un enlace. Espero que esto pueda ayudar a aquellos que sufren el mismo problema.

Kemin Zhou
fuente
1

Veamos cuál es la ruta de búsqueda de inclusión predeterminada de gcc. De esta respuesta , obtenemos este comando:

gcc -xc -E -v -

Al final de la salida, veo esto en mi máquina:

ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/lib/gcc/x86_64-linux-gnu/4.8/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include

Observe la penúltima línea. Eso significa que cuando compila un archivo C #include <sys/stat.h>, gcc buscará /usr/include/x86_64-linux-gnu/sys/stat.hantes de intentarlo /usr/include/sys/stat.h, sin que tengamos que vincular nada.

legoscia
fuente
0

Como mi arquitectura es amd64, no la hay libc6-dev-amd64. El paquete para instalar es libc6-dev-i386.

Eso solucionó la dependencia de un paquete CPAN.

Jari Turkia
fuente
'Dado que mi arquitectura es amd64 no hay libc6-dev-amd64' : ¿a qué te refieres?
Marc Vanhoomissen
Lo que quiero decir es que en la arquitectura x86_64, bibliotecas / kernel / etc. los paquetes tienen arquitectura amd64. Entonces, libc6-dev-amd64 no está disponible para instalar. Aún persiste el problema, algunos programas esperan ver / usr / include / sys /.
Jari Turkia