2010-07-21 22 views
11

Tenemos un no muy complicado pero grande (es decir, muchos archivos) Consola Visual Studio C++ Win32 escrita en C++ 0x estándar en VS2010. No utiliza ningún código no estándar ni nada (¡con suerte!).Puerto Visual Studio C++ a Linux

Ahora quiero portarlo a Linux. ¿Cuál es la forma más rápida de hacerlo? autoconf? anticuado hacer archivo? alguna otra solución?

+0

¿Extraño algo? C++ 0x es un estándar * propuesto * que escuché por última vez, lo que significa que su código ** es ** no estándar si está escrito usando características de eso. –

+0

en realidad C++ 0x es el nombre no oficial del nuevo estándar planificado para el lenguaje de programación C++. – MBZ

+0

¿* * * propuesto * contra * propuesto * significa alguna diferencia en el estado de la ratificación? Solo me da miedo escribir código en cualquier cosa hasta que sea ** el ** estándar. –

Respuesta

7

Utilizaría la marca habitual pero la mantendré simple con las reglas predeterminadas tanto como sea posible. Agregue dependencias a medida que avanza.

EDIT: Como en el paso intermedio, compárelo con mingw para que pueda evitar el problema de portabilidad API completo hasta que tenga una compilación activa en su nuevo mecanismo de compilación.

Si su aplicación de consola llama a las funciones API de win32, puede elegir entre modificar todo el origen donde se utiliza o escribir un módulo que implemente esas funciones.

En anteriores esfuerzos de portado de este tipo, lo intenté en ambos sentidos y este último fue más fácil. Terminé escribiendo solo de 18 a 20 funciones de calce.

Tuve tanto éxito que terminé escribiendo una capa de abstracción de SO que se usó en muchos proyectos que simplemente me permitían compilar en Windows nativo, cygwin, Linux, VxWorks, etc. con cambios triviales en uno o dos archivos.

(ps Cualquier interés en una versión de código abierto de una capa de abstracción del sistema operativo basada en C++? Estaba pensando en lanzar una versión no comprometida del mundo si hay interés suficiente. Es sobre todo útil cuando BOOST es demasiado pesado, es decir proyectos integrados.)

2

Puede exportar un archivo make desde Visual Studio.

actualización: En realidad no se puede más, a menos que tenga VC6 por ahí

+0

thankx. cualquier tutorial, enlace, palabra clave? – MBZ

+0

Actualizado como estaba equivocado. –

+2

No me importa ni VS ni C++, pero +1 para el avatar pegadizo;) –

3

Lo más probable es que no es necesario autoconf (y yo sugiero que no lo toca, unless you love pain), ya que son no tratando de ser portátil a una docena de sabores de Unix.

  1. Extienda sus Makefiles manualmente. No debería ser demasiado difícil si tiene un conjunto de reglas compartidas y tiene Makefiles mínimos que solo especifican los archivos fuente y las opciones de compilación.
  2. Utilice GCC 4.5 como it supports more C++0x features.
1

MANTENGASE ALEJADO DE AUTO * y configure. Estos son horribles en mi humilde opinión.

Si de alguna manera puede obtener un VS 8 o 9 vcproj/sln, puede usar this. No lo he usado, así que no puedo dar ningún consejo.

Si está listo para la conversión manual, sugeriría algo como CMake, ya que es bastante fácil prepararse lo suficientemente rápido, incluso para proyectos grandes.

Si el proyecto tiene un diseño simple, usted podría tener éxito en el uso qmake de Qt 4 así:

qmake -project 

Se dará salida a un archivo de qmake .pro, que se puede convertir en un archivo MAKE en muchas plataformas (usando qmake). Esto debería funcionar bien, pero no perfectamente. Alternativamente, puede instalar el complemento Qt para VS y dejar que genere el archivo pro de un proyecto VS existente. Hará que tu sistema de compilación dependa de qmake de Qt4, que probablemente no sea lo que deseas.

Por supuesto, hay otras cosas como cmake, pero todas requerirán intervención manual.

1

¿La forma más rápida de hacerlo?

g++ *.cpp -o myapp 

En serio, dependiendo de sus necesidades, incluso generar un archivo MAKE puede ser excesivo. Si solo está interesado en una versión rápida y sucia de "veamos si podemos obtener un programa que funcione en Linux", simplemente eche los archivos de código en g ++ y vea qué sucede.

Cuestiones relacionadas