2009-05-07 17 views
6

Necesito escribir un pequeño programa para la universidad. El problema es que tiene que estar en C/C++ bajo Linux, y nunca he usado Linux, anticipo tener muchos problemas con el IDE, la compilación y todo eso.Programación multiplataforma

¿Es posible codificarlo en Windows y luego "copiar/pegar" el código y compilarlo en Linux? ¿Cuáles son las limitaciones que debería conocer si es posible?

Será un programa pequeño, comunicación cliente/servidor típica utilizando sockets.

+0

Si ha utilizado las API de Windows, es posible que funcionen en mono, y no funcionarán de lo contrario ... escribir en un marco multiplataforma (como sugiere Conrad) es probablemente una buena idea. – dmckee

+2

No puede estar en C/C++, ya que no existe tal lenguaje. Podría estar en C o en C++, o combinar tanto C como C++. –

+0

@Daniel, no sé si tu comentario es serio o una broma, pero por si acaso, aclaro, quise decir C * o * C++ – juan

Respuesta

26

Creo que hay que ir adelante y hacerlo bajo Linux (gcc?). Esto te enseñará algunas cosas sobre la programación de la "vieja escuela". Olvídate de usar un IDE, usa vim (si ya lo tienes) o nedit (más como un bloc de notas).

Compilar en la línea de comando. Vincúlalo tú mismo. Escribe un archivo make para hacer esto.

Esto es lo básico. Debe comprenderlo antes de usar un IDE. ¡Haga esto mientras todavía está en la universidad, porque es un dolor y usted (y debería) querer usar un IDE para el trabajo real!

Además, no es difícil lograr una comprensión básica de Unix (he encontrado mi camino en torno a Solaris, Ubuntu y OS X, provenientes de un fondo de Windows): algunos simples tutoriales deberían ponerlo en funcionamiento. Para escribir pequeños proyectos escolares, no hay mucho que necesite saber: cd, ls, mkdir, make, gcc (asegúrese de usar g++ para proyectos en C++ - eso me ha picado en mi Mac antes ...). Permanezca cerca de su directorio particular (~).

Realizar su proyecto en el sistema de destino le ayudará a obtener ciertas cosas correctas: Al hacer estos ejemplos simples de sockets y pthreads, encontré compilando y vinculándolos para que no sean portátiles de la plataforma. En ciertos sistemas, el enlace en las bibliotecas debe hacerse de esta manera, en otros de esa manera.

Por cierto: Si realmente haces quiere hacer esto en Windows, lo mejor es tener un entorno POSIX en Windows. Los enchufes POSIX son diferentes al modelo de red de Windows si no recuerdo mal.

Pruebe MinGW o Cygwin. Ambos deberían darle el entorno de desarrollo * nix en Windows. Usted puede utilizar su editor de texto favorito y cmd.exe en lugar de fiesta para iniciar el compilador :)

EDITAR (un puerto de Windows de vim?): En este momento, si el tono es de confrontación (de acuerdo a comentar). Trataré de suavizarlo un poco. Es solo que ... He visto bastantes personas tratando de aprender C/C++ (o Java para el caso) con IDEs y han llegado a creer que se interponen en el camino para comenzar. Seguro, necesitará mejores herramientas para los programas de la vida real, pero la sobrecarga de los archivos del proyecto, etc. para los proyectos de muestra de la escuela agrega desorden. También hace más difícil enviar su tarea por correo electrónico a su profesor: un archivo comprimido con varios archivos .c y .h y un archivo MAKE es realmente tan simple como se consigue ...

+2

Su tono es un poco conflictivo, pero estoy de acuerdo con sus declaraciones.La mejor forma de aprender a programar en un entorno dado es ir directamente al interior. +1 –

+5

Este es un buen consejo para utilizar The Unix Way (tm) (módulo s/vim/emacs/g por supuesto), pero para obtener el hecho el trabajo, probablemente sea mejor usar eclipse o algo así. – dmckee

+0

Gracias por el consejo, pero no creo que vuelva a utilizar linux ... Ya tengo una imagen de ubuntu en una máquina virtual en mi computadora portátil, pero la sobrecarga de "no encontrar las cosas básicas" me está volviendo loco – juan

5

Tener un vistazo a la QT Library and tools

+1

Creo que QT podría ser un poco exagerado para un pequeño proyecto universitario. – nstehr

+1

No, Qt es bastante fácil, y no necesitará una licencia comercial. – MSalters

8

Si necesita hacer la codificación en Windows, recomendaría usar mingw/msys como entorno de desarrollo. Msys implementa un shell unix en windows, y mingw es un puerto de gnu compiler collection (gcc) y otras herramientas de compilación gnu para la plataforma de Windows. Es un proyecto de código abierto y adecuado para la tarea.

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

+0

Gracias, lo comprobaré – juan

7

Técnicamente, puede escribir una gran cantidad de código que funcionará con muy pocos cambios en las plataformas Windows y Linux.

Sin embargo, las cosas se ponen difíciles en algunos casos. A menudo es más fácil ir desde Linux -> Windows que desde Windows -> Linux, simplemente porque los usuarios de Windows tienden a usar llamadas a la API de Windows que no tienen equivalentes de Linux.

Si va a utilizar una GUI, querrá utilizar una GUI multiplataforma. Qt o wxWidgets son buenas opciones. Qt, en particular, también tiene muchas clases de utilidad multiplataforma que quedan fuera del espacio de la GUI y pueden ayudar con los problemas del socket.

Si su objetivo es simplemente tenerlo funcionando en Linux, y el software no tiene que ejecutarse en Windows, le recomiendo que brinde y trate de hacerlo funcionar desde el principio. Será más fácil que tratar de portar.

En cuanto a un IDE de Linux, en algún momento, planee saltar y usar herramientas Linux, necesitará un sistema de compilación diferente (a menos que use una solución multiplataforma como cmake o scons), habrá IDEs diferentes si usa IDEs, etc.

KDevelop es un buen IDE que será más familiar que intentar hacer todo desde una línea de comandos, si está acostumbrado a trabajar en un IDE integrado.

+0

Muchos proyectos OSS de Linux están llenos de POSIX-ismos que no tienen un equivalente razonable en Windows aparte de cosas como Cygwin que lo proporcionan. La plataforma cruzada es simplemente más difícil que la codificación de una sola plataforma porque debes reconocer los problemas de portabilidad sobre la marcha. – RBerteig

3

Si puede escribir el programa utilizando solo las bibliotecas C estándar, entonces teóricamente ya debería ser compatible con varias plataformas, ya que la biblioteca C está diseñada para ser totalmente portátil. Dicho esto, vas a tener problemas con los sockets, que a menos que esté equivocado suelen ser específicos de la implementación.

Linux (Ubuntu especialmente) no es realmente tan difícil de usar, pero la falta de un IDE real para el desarrollo por lo general echa a la gente. Lo que recomiendo es compilar usando Cygwin para Windows y probar un editor de código llamado CodeBlocks mientras lo hace. Cygwin compilará su código contra las bibliotecas de Linux en lugar de las de Windows (y luego emulará esas bibliotecas usando un .dll de Windows cuando lo ejecute), por lo que es una buena forma de familiarizarse con sus limitaciones. Debería poder configurar un proyecto CodeBlocks en Windows, y luego abrir ese mismo proyecto bajo la versión Linux de CodeBlocks y probar su compilación.

El código multiplataforma no es terriblemente fácil de escribir, lo admito, pero es más que posible con un poco de esfuerzo.

+1

También podría usar Eclipse CDT. –

+0

Ooh, buena llamada. Sigo olvidando que Eclipse no es solo para Java.^_^ –

1

Si se apega a los estándares de C/C++, no debería tener problemas para transferir un código bien escrito de Windows a Unix, con algunos ajustes menores de los encabezados incluidos y similares.

Supongo que no hay ninguna GUI que no sea la línea de comandos, ya que es una asignación de cliente/servidor en Linux, que lo hace posible. Pero tenga mucho cuidado de que se adhiera a los sockets de estilo Unix y los estándares C/C++, y no use ninguna biblioteca de Windows o atajos.

4

En lugar de cortar y pegar, divida su proyecto en archivos independientes de la plataforma y archivos específicos de la plataforma y/o utilice directivas de preprocesador para personalizar el código. La mayor parte de mi trabajo es para Windows, y es bueno usarlo como banco de pruebas para Linux con herramientas que son familiares.

+0

La división de los archivos es una buena idea, aunque si decide ir con QT o WxWidgets, no debería tener demasiado que sea específico de la plataforma. –

0

Si no utiliza el código específico de API de Windows o las bibliotecas que no son de plataforma cruzada, y si es C++ estándar, si no utiliza características específicas del compilador de microsoft, debe ser multiplataforma y funcionar en Linux.

El compilador provisto con Linux se llama GCC. Hay una versión de Windows llamada MinGW. Podrías probarlo antes de probar con Linux. Si se compila en MinGW, ciertamente se compilará en Linux. (El problema es que MinGW no está actualizado con las últimas versiones de GCC ...)

Para el uso de bibliotecas que no son multiplataforma (quizás bibliotecas de GUI), tendrá que cambiarlas, pero la mayoría de las bibliotecas de GUI no OS-specific son multiplataforma de todos modos. Para otras bibliotecas, encontrarás equivalentes en otras plataformas, supongo.

+1

en realidad, el compilador aún es GCC, MinGW es un entorno en el que GCC ha sido portado para ejecutarse. –

+0

En realidad, MinGW es una distribución de GCC, así como el equipo de personas que aseguran que los compiladores de GCC y las herramientas relacionadas puedan ser construidos como binarios nativos de Windows y producen binarios nativos de Windows. Aprovechan la biblioteca de tiempo de ejecución MSVCRT.DLL C existente que se envía como un componente del sistema para proporcionar libc y libm, y proporcionan archivos de encabezado compatibles con GPL escritos independientemente para la API de Windows. Los programas compilados con la distribución MinGW de GCC son ejecutables nativos y (normalmente) no tienen dependencias de tiempo de ejecución inesperadas. – RBerteig

4

first: install Cygwin, esto proporciona un entorno similar a UNIX para Windows con API POSIX que MingW no proporciona, por ejemplo fork(). Entonces, podrías trabajar en Windows y sentirte como en Linux.

Segundo: Sugiero acostumbrarme a Linux/instalarlo, sabiendo que el entorno Linux/UNIX haría su vida en la universidad (y no solo allí) mucho más fácil.

2

Tanto Windows como las plataformas de estilo Unix ofrecen Berkeley Sockets API, pero la implementación de Windows tiene algunas diferencias, p. el uso de las funciones WSAStartup() y WSACleanup(). Aparte de eso, unos pocos #ifdef sy la aplicación se compilarán en ambas plataformas sin ningún problema. Asumiendo que se supone que es una simple aplicación de línea de comandos, por supuesto. Hay una sección Porting Socket Applications to Winsock en MSDN. Todo lo que tienes que hacer es trabajar al revés. ;)

Lea también un libro sobre la programación de socket, por ejemplo Beej's Guide to Network Programming.

Otra opción es usar Boost::Asio. Esto oculta las diferencias de API de los sockets sin problemas.

1

Juan,

Si estás volviendo loco aprendiendo su manera alrededor de Linux, entonces usted no tiene la paciencia necesaria para ser un programador. Codificar no es glamour, requiere un esfuerzo meticuloso, leer documentación, probar cosas, mirar un depurador durante horas.

Necesita volver a pensar en participar en la programación o abrocharse el cinturón de seguridad y esforzarse para aprender a navegar por Linux, que no es ni remotamente tan complejo como cualquier lenguaje de programación útil.

+3

hmm, no estoy de acuerdo. Solo se trata de optimizar mi tiempo y priorizar, no es una cuestión de actitud u "odio a Linux", es un programa pequeño para un curso universitario ... Ya tengo una programación laboral a tiempo completo, una esposa embarazada y varios otros temas que estoy tomando =) Pero gracias por el consejo – juan

+4

No estoy de acuerdo con la evaluación de Ben de "no estás preparado para eso", pero aprender Linux definitivamente vale la pena el esfuerzo en el largo plazo. Sigue intentándolo! – Parappa

2

Estoy de acuerdo con otros en que si instalas algo como Ubuntu Linux, no es tan difícil de aprender. Pero para responder a su pregunta real, el problema principal es evitar el uso involuntario de las API de Windows. Mi entorno favorito para esto es el conjunto de herramientas AT & T U/Win, que está diseñado para compilar aplicaciones POSIX en Windows. Parece generar menos quejas de los desarrolladores que mingw, que a su vez genera menos quejas que cygwin.