2009-02-21 9 views
9

Estoy portando una aplicación escrita en C++ desde Windows a Linux. Tengo un problema con la ruta de los archivos de encabezado. Windows usa \ y Linux usa /. Me resulta engorroso cambiar esto en todos y cada uno de los archivos fuente y encabezado. ¿Hay algo de trabajo?Incluir cambio de ruta de encabezado de Windows a Linux

+13

Cuando finalmente arreglar eso, recuerde: NUNCA uso cada vez barras invertidas. Las barras diagonales funcionan tanto en Windows como en Linux. –

Respuesta

26

Utilice siempre barras diagonales en las rutas #include. El trabajo del compilador consiste en asignar la ruta al esquema de directorio/barra que soporte el sistema operativo subyacente.

+13

-1. En mi humilde opinión, estás respondiendo la pregunta incorrecta: el tipo ya tiene una pila de archivos con rutas #include inclinadas hacia atrás. Necesita una ambulancia, no alguien que le diga que no debería haber conducido tan rápido. –

+0

¡Buena pregunta! Supongo que quiso decir que quiere evitar tener que cambiar continuamente entre/y \ mientras se mueve entre los proyectos. (OP podría aclarar por favor?) Bajé mi -1 ya que obviamente la opinión del OP de lo que el OP quiere supera a la mía :) –

+0

@j_random_hacker Están portando (al menos, él estaba cuando se escribió la pregunta) por lo que todavía están conducir y aún no se estrellan. Voltear la dirección de barras en sus archivos es una sola declaración de perl. –

4

¿Qué versión de Windows está utilizando? Hasta donde yo sé, comenzando con Windows XP, las barras diagonales realmente funcionan como delimitadores de ruta.

+1

Creo que el OP va de Windows a Linux, no de Linux a Windows –

+0

en realidad la aplicación está codificada para diferentes plataformas. Y estoy usando los archivos codificados por otra persona. Estoy interesado en saber si existe una manera más fácil de cambiar las barras diagonales inversas a barras diagonales u obtener un efecto similar. –

5

Utilice siempre barras diagonales en las directivas #include. Algunos sistemas operativos/compiladores lo requieren, y Windows/Visual Studio es lo suficientemente inteligente como para manejarlo correctamente.

Desde que empiezas con el código de Windows, asumo que tienes Visual Studio. Use el cuadro de diálogo Buscar y reemplazar y cree una expresión regular que hará la sustitución por usted. Ejecute el buscar y reemplazar en todos los archivos.

Por ejemplo, usar algo como esto:

#include:b+<{[^\\\>]}\\ 

para su búsqueda expresión y

#include <\1 

para la expresión de reemplazo (advertencia: no probado). Ejecute esto en todos los archivos hasta que no se realicen reemplazos. Luego cambie los corchetes en ángulo a comillas y repita.

7

Las API de Windows tienen siempre soportaron barra diagonal como separador de directorio. Y eso se debe a que, al menos desde atrás, al menos DOS 3.1 también fue compatible. El problema siempre ha sido COMMAND.COM y CMD.EXE. Usan barra inclinada como indicador de opción (en lugar de guión como se encuentra en Unix). Nunca utilice barras diagonales inversas para separadores de directorios en idiomas en los que se utiliza una barra invertida en una cadena para escapar de caracteres especiales.

Si no tiene un shell Unix, ¿no tiene un editor que busca/reemplaza en varios archivos? Diablos, escribe un pequeño programa para hacerlo si es necesario. El análisis del código fuente de C++ para sus declaraciones #include no puede ser difícil.

+1

No siempre ha soportado la barra diagonal que fue un gran problema para las edades. Pero ahora sí. –

+2

Al menos de regreso a DOS 4.0 lo hizo. – jmucchiello

+0

joe: definitivamente no es cierto. Los compiladores pueden haberlo admitido para incluir, y la interfaz de usuario de Explorer ciertamente lo hizo. Pero WinAPI en general no lo hizo. –

10

¡Usted gente! , puede y siempre debe usar barras diagonales. Creo que el problema es cómo obtener allí de aquí!

Si ha instalado Perl, el siguiente revestimiento será convertir un archivo fuente en C++ para utilizar barras inclinadas, de guardar la versión original en un archivo con extensión .bak:

perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" myfile.cpp 

(La línea de comandos anterior es para Windows: si está utilizando Linux u otro shell tipo Unix, use comillas simples alrededor del tercer parámetro en lugar de comillas dobles.)

Si usted tiene un montón de archivos que necesita para convertir, por ejemplo todos los archivos que terminan en .cpp:

for %f in (*.cpp) do perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" %f 

El comando correspondiente para un entorno de shell Bourne (shell Linux típico):

for f in *.cpp; do perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/' $f; done 

Si no tiene Perl instalado, debería poder encontrar un editor de texto que permita buscar y reemplazar archivos.

+1

Es posible que desee utilizar un separador diferente que! si está usando tcsh. –

+0

@mrree: Buen punto. También necesitará cambiar algo la sintaxis del bucle for (Olvidé la sintaxis exacta por desgracia). –

+0

foreach f (* .cpp) .... end; No creo que puedas hacerlo todo en una sola línea ... –

0

Usted puede intentar este comando basado en Perl comando anterior, que haga el trabajo recusrively

find . -type f -name \* | xargs grep '#include' | grep '\\' |awk -F: '{print $1}'|sort| uniq | xargs -n1 perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/' 
Cuestiones relacionadas