Una fuente debe comstackrse de manera diferente en varias máquinas

Tengo un progtwig en C ++ que está diseñado para ejecutar una simulación para un proyecto de verano que estoy haciendo. Es bastante intensivo desde el punto de vista computacional, pero he obtenido permiso para usar los resources de una computadora de clúster para ejecutarlo, pero lo pruebo y lo desarrollo en mi propia computadora portátil. Este progtwig genera files de text como salida, y aquí es donde me encuentro con problemas.

Necesito que los files de text se guarden en diferentes routes dependiendo de si estoy ejecutando el progtwig en mi propia computadora o en la computadora del clúster. Mi solución por el momento ha sido usar $(shell hostname) en mi file MAKE para verificar en qué máquina se está comstackndo el código y, a partir de ese resultado, usar la compilation condicional con macros definidas a partir de esa operación en el file MAKE. En un momento, estaba usando dos versiones diferentes de un encabezado que definía las macros de forma diferente en mi computadora en comparación con el clúster, pero estoy usando un repository de git para transferir los cambios de un lado a otro, y estaba teniendo dificultades para excluir un file Me gusta esto.

Me preguntaba cuál es la práctica más preferible para establecer routes en time de compilation en diferentes computadoras con la misma fuente.

No me parece que deba comstackrse de manera diferente en diferentes máquinas. Parece que necesita tomar algunas routes en time de ejecución desde la línea de command o desde algún tipo de file de configuration.

Una sugerencia sería usar la biblioteca de opciones del progtwig boost que en una configuration simple le permite leer los mismos params desde la línea de command o desde un file de configuration. Esto es lo que usé cuando ejecuté trabajos similares en un gran clúster o en mi computadora portátil y funcionó muy bien.

A continuación se muestra un ejemplo simple de sus documentos:

 // Declare the supported options. po::options_description desc("Allowed options"); desc.add_options() ("help", "produce help message") ("compression", po::value<int>(), "set compression level") ; po::variables_map vm; po::store(po::parse_command_line(ac, av, desc), vm); po::notify(vm); if (vm.count("help")) { cout << desc << "\n"; return 1; } if (vm.count("compression")) { cout << "Compression level was set to " << vm["compression"].as<int>() << ".\n"; } else { cout << "Compression level was not set.\n"; } 

Estoy de acuerdo con Alex, la solución más fácil no será en time de compilation, sino en time de ejecución ya sea a través de un file de configuration o arguments de línea de command. En igualdad de condiciones, puede ser más fácil para usted tratar de pasarlo a través de arguments de línea de command utilizando argv y argc .

No tengo mucha experiencia con esto, pero puedo pensar en una forma simple de hacerlo.

Configure una variable de entorno que apunte al directory apropiado en cada máquina y use esa variable de entorno en su file MAKE.

Por ejemplo,

en la máquina 1 ~ / .bashrc

 export MY_DIRECTORY = ~/Foo 

en la máquina 2 ~ / .bashrc

 export MY_DIRECTORY = ~/Bar 

su Makefile usará la variable de entorno de la máquina en la que se está ejecutando. P.ej. $ (MY_DIRECTORY) Y (~ / .bashrc no es parte de su repository, por lo que pueden existir diferentes copys en las dos máquinas)

Si puede soportar una dependencia en QtCore (entre 750K y 4MB de biblioteca según las opciones de compilation y la plataforma), puede usar QSettings para almacenar convenientemente la ruta del directory sin tener que establecer la ruta del directory cada vez. Puede pasarlo en la línea de command en time de ejecución una vez y hacer que el progtwig almacene el resultado en el file de configuration, y luego esa configuration se convertirá en el nuevo valor pnetworkingeterminado para futuras invocaciones del progtwig sin el argumento de la línea de command.

Otras alternativas libres de dependencia implicarían escribir sus propias rutinas de análisis de files de configuration o usar las existentes, pero siempre me gusta confiar en un código fuente bien probado y de código abierto.

¡Buena suerte!

Puedes continuar con la ruta de usar encabezados separados. Incluya ambos en su repository Git como clusterHeader.h y laptopHeader.h y use su script Makefile existente para comstackr con un encabezado diferente en cada sistema. Para facilitar los problemas de vinculación, quizás renombre temporalmente o copie el file dentro de la secuencia de commands de clusterHeader.hpp o laptopHeader.hpp a simplemente old header.h mientras construye, y cambie el nombre al final de la secuencia de commands.

Si desea mantener los cambios en su encabezado consistentes entre comstackciones, use este método como otro file de encabezado, e #include ese encabezado dentro de su encabezado independiente de sistema operativo.

es decir

 source.cpp | -> header.hpp | -> clusterHeader.hpp OR laptopHeader.hpp 

Alternativamente, siempre y cuando los sistemas no sean exactamente el mismo sistema operativo (lo cual supongo que no lo son, ya que uno es un clúster), probablemente puedas hacerlo funcionar fácilmente con algunas simples declaraciones #ifdef .

Finalmente, CMake o qmake son siempre opciones.