2008-12-04 19 views
131

Estoy portando un programa de consola relativamente simple escrito para Unix a la plataforma de Windows (Visual C++ 8.0). Todos los archivos de origen incluyen "unistd.h", que no existe. Al eliminarlo, recibo quejas sobre la falsificación de prototipos para 'srandom', 'random' y 'getopt'. Sé que puedo reemplazar las funciones aleatorias, y estoy bastante seguro de que puedo encontrar/piratear una implementación de getopt.¿Hay un reemplazo para unistd.h para Windows (Visual C)?

Pero estoy seguro de que otros se han encontrado con el mismo desafío. Mi pregunta es: ¿hay un puerto de "unistd.h" para Windows? Al menos uno que tenga funciones que tengan una implementación nativa de Windows, no necesito tuberías ni bifurcaciones.

EDITAR:

sé que puedo crear mi propio "unistd.h", que contiene los reemplazos para las cosas que necesito - especialmente en este caso, ya que es un conjunto limitado. Pero dado que parece un problema común, me preguntaba si alguien ya había hecho el trabajo para un subconjunto más grande de la funcionalidad.

No es posible cambiar a un compilador o entorno diferente en el trabajo - Estoy atascado con Visual Studio.

Respuesta

134

Como no podemos encontrar una versión en Internet, comencemos una aquí.
La mayoría de los puertos para Windows probablemente solo necesiten un subconjunto del archivo Unix completo.
Aquí hay un punto de partida. Por favor agregue definiciones según sea necesario.

#ifndef _UNISTD_H 
#define _UNISTD_H 1 

/* This is intended as a drop-in replacement for unistd.h on Windows. 
* Please add functionality as neeeded. 
* https://stackoverflow.com/a/826027/1202830 
*/ 

#include <stdlib.h> 
#include <io.h> 
#include <getopt.h> /* getopt at: https://gist.github.com/ashelly/7776712 */ 
#include <process.h> /* for getpid() and the exec..() family */ 
#include <direct.h> /* for _getcwd() and _chdir() */ 

#define srandom srand 
#define random rand 

/* Values for the second argument to access. 
    These may be OR'd together. */ 
#define R_OK 4  /* Test for read permission. */ 
#define W_OK 2  /* Test for write permission. */ 
//#define X_OK 1  /* execute permission - unsupported in windows*/ 
#define F_OK 0  /* Test for existence. */ 

#define access _access 
#define dup2 _dup2 
#define execve _execve 
#define ftruncate _chsize 
#define unlink _unlink 
#define fileno _fileno 
#define getcwd _getcwd 
#define chdir _chdir 
#define isatty _isatty 
#define lseek _lseek 
/* read, write, and close are NOT being #defined here, because while there are file handle specific versions for Windows, they probably don't work for sockets. You need to look at your app and consider whether to call e.g. closesocket(). */ 

#ifdef _WIN64 
#define ssize_t __int64 
#else 
#define ssize_t long 
#endif 

#define STDIN_FILENO 0 
#define STDOUT_FILENO 1 
#define STDERR_FILENO 2 
/* should be in some equivalent to <sys/types.h> */ 
typedef __int8   int8_t; 
typedef __int16   int16_t; 
typedef __int32   int32_t; 
typedef __int64   int64_t; 
typedef unsigned __int8 uint8_t; 
typedef unsigned __int16 uint16_t; 
typedef unsigned __int32 uint32_t; 
typedef unsigned __int64 uint64_t; 

#endif /* unistd.h */ 
+17

Un puerto completo de GNU getopt se encuentra aquí: http://www.codeproject.com/KB/cpp/getopt4win.aspx – Annie

+0

'ssize_t'? ¿No se supone que es 'size_t'? –

+2

no, 'ssize_t' es correcto: http://www.delorie.com/gnu/docs/glibc/libc_239.html – AShelly

20

Recomendaría usar mingw/msys como entorno de desarrollo. Especialmente si está portando programas de consola simples. Msys implementa un shell tipo Unix en Windows, y mingw es un puerto de GNU compiler collection (GCC) y otras herramientas de compilación de GNU para la plataforma de Windows. Es un proyecto de código abierto y adecuado para la tarea. Actualmente lo uso para crear programas de utilidad y aplicaciones de consola para Windows XP, y ciertamente tiene ese encabezado unistd.h que está buscando.

El procedimiento de instalación puede ser un poco complicado, pero encontré que el mejor lugar para comenzar es en MSYS.

+1

y estos días MSYS2 –

-1

Crea tu propio encabezado unistd.h e incluye los encabezados necesarios para los prototipos de funciones.

+6

Sé que puedo hacer eso, voy a editar la pregunta para que quede más claro. El objetivo de la pregunta era: ¿alguien más lo ha hecho por mí? – AShelly

5

No, IIRC no hay getopt() en Windows.

Boost, sin embargo, tiene la biblioteca program_options ... que funciona bien. Al principio parecerá exagerado, pero no es terrible, especialmente considerando que puede manejar la configuración de opciones de programas en archivos de configuración y variables de entorno además de las opciones de línea de comandos.

+0

google divertido para "ventanas getopt" dar esto como el primer golpe: http://www.codeproject.com/KB/cpp/xgetopt.aspx –

+0

El punto no era tener que volver a escribir el código existente para usar Boost o algunos otro analizador – AShelly

+0

@ AShelly: me temo que si codificas utilizando * solo API, entonces no tienes más remedio que volver a escribir el código existente para que sea portátil, o para proporcionar tu propia implementación de la funcionalidad faltante. Si utilizó boost :: program_options para empezar, funcionará en muchas plataformas sin cambios. – paxos1977

89

Intente incluir el archivo io.h. Parece ser el equivalente de Visual Studio de unistd.h.

Espero que esto ayude.

+0

me ayudó, gracias :) – anhoppe

13

Me encontré con este hilo mientras trataba de encontrar una alternativa de Windows para getpid() (definida en unistd.h). Resulta que incluir process.h hace el truco. Tal vez esto ayude a las personas que encuentren este hilo en el futuro.

Cuestiones relacionadas