2011-02-03 13 views
12

Tengo un programa que consiste en varios proyectos en eclipse (trabajando bajo ubuntu y los proyectos en C++), estos proyectos consisten en un archivo ejecutable principal y otros archivos de objetos compartidos y estáticos libs.Establecer Generar directorio de salida en Eclipse - C++

Quiero todos estos proyectos cuando se crean para generar sus archivos en una carpeta binaria común, en lugar de sus respectivas carpetas de depuración. Esto es para facilitar el enlace con el ejecutable principal. Si hay mejores soluciones, no dude en compartirlas.

Respuesta

13

Desafortunadamente, he encontrado que la pestaña C/C++ Build no le permite establecer la ubicación de compilación a menos que esté creando su propio archivo MAKE.

Usted probablemente ha encontrado que la configuración del generador de lengüeta debajo Propiedades del proyecto> C/C++ Build es todo en gris en un proyecto predeterminado C/C++. Esto se debe a que CDT designa el generador interno por defecto para nuevos proyectos. Para cambiar esto, puede ir al Propiedades del proyecto> C/C++ Build> Tool Chain Editor y cambiar el Current Builder al Gnu Make Builder. A continuación, vaya a Propiedades del proyecto> C/C++ compilación y cambie el tipo de generador a generador externo. Ahora puede optar por crear su propio archivo MAKE para el proyecto, si lo desea; aunque recomendaría dejar CDT para construir el archivo MAKE automáticamente por el momento.

Tengo los mismos requisitos de proyecto para enviar a/project_path/bin (aunque todavía mantengo la separación entre las compilaciones Debug y Release). Para hacer esto, realizo una operación de copia en la salida como un paso posterior a la construcción.

Para ello, vaya a Propiedades del proyecto> C/C++ Build> Configuración y seleccione el etapas de la generación pestaña. En el posterior a la generación pasos bajo Comando:, introduzca:

cp ${BuildArtifactFilePrefix}${BuildArtifactFileName} "/path/to/bin/directory/"; 

reemplazando Obviamente, el "/ ruta/a/bin//" según sea necesario.

Personalmente prefiero mantener mis archivos de proyecto en un workspace/build directorio; copia de binarios en un directorio workspace/bin y bibliotecas en un directorio espacio de trabajo/lib. Al principio, encontré esta solución temporal como una inconveniencia, pero he llegado a apreciarla porque aísla los archivos de compilación intersticiales del último archivo binario/biblioteca.

para binarios, me gustaría utilizar:

cp ${BuildArtifactFilePrefix}${BuildArtifactFileName} "${WorkspaceDirPath}/bin/"; 

Para las bibliotecas, me gustaría utilizar:

cp ${BuildArtifactFilePrefix}${BuildArtifactFileName} "${WorkspaceDirPath}/lib/"; 

que incluyen la variable "$ {BuildArtifactFilePrefix}" porque CDT incluye "lib" como una prefijo predeterminado para bibliotecas estáticas, que en realidad prefiero.

Solo necesita asegurarse de que el directorio de destino exista antes de compilar; Eclipse/CDT no creará el directorio para usted.

Además, sólo recuerda que estas copias se quedará atrás en el /bin o /lib directorio en limpio, pero sobrescribir en cualquier posterior reconstrucción.

+0

Gran solución, gracias –

+0

Existe una opción para un paso posterior a la compilación, por lo que lo más fácil es dejarlo compilar donde lo hace y, si eso funciona, usar el paso posterior a la compilación para copiarlo/moverlo o vincularlo. ¿Hay una macro especial para depuración o liberación para que pueda usar una común para ambas configuraciones? – CashCow

0

Si abre las propiedades del proyecto, hay una pestaña C/C++ Build. Tiene una opción para la ubicación de la compilación, donde puede especificar el directorio de compilación. Parece que podría cambiar esto para sus proyectos múltiples para que compartan el mismo directorio de compilación.

4

Trate Project->Properties

Bajo C/C++ Build->Settings tiene una pestaña llamada Build Artifact.

Ahí tienes Artifact name. Esto se predetermina como ${ProjName}.

Modifique esto para especificar una ruta de directorio relativa hacia donde realmente desea que termine el archivo final. Entonces podría ser ../../lib/${ProjName}

Los archivos intermedios (.o y .d) seguirán compilando en el subdirectorio (Depuración o Liberación) pero supongo que es mejor si están allí de todos modos y es solo la biblioteca finalmente creada para el cual quiere cambiar la ruta de compilación.

Si le resulta incómodo escribir la ruta relativa de esta manera, utilizo Environment para crear variables de entorno con rutas relativas que me devuelvan a una "raíz". Uno de esto que tengo es ${LIBDIR} y esta es una ruta relativa desde donde se construye el proyecto. Por lo general, se usa para vincular en otras bibliotecas, pero también se puede usar como un objetivo. A continuación, establecería Artifact Name en ${LIBDIR}/${ProjName}, que funciona bien si utiliza diferentes directorios para las compilaciones de depuración y liberación.

+1

Esto no tiene ningún efecto. Usando Luna versión 4.4.0. Puedo cambiar el nombre del ejecutable, pero la parte de la ruta se ignora. – truthseeker

+0

Interesante, funcionó para mí. – CashCow

+0

Funcionó para mí también, gracias! $ {workspace_loc: MyProject}/_ runtime/$ {ProjName} – macroland

0

acaba de pasar a estar trabajando en algo que me llevó por un camino similar - por lo que voy a ofrecer como una solución alternativa/recordatorio para mí mismo:

En Eclipse (al menos en el Luna) los archivos make generados en realidad son bastante decentes y convenientes. Personalmente, me gusta crear varias configuraciones de compilación (versiones Release y Debug con arquitecturas de 32 y 64 bits) y complementarlas con las configuraciones de depuración y ejecución (F5 y Execute, respectivamente).

Para continuar: He estado jugando con los paquetes en Debian y encontré, durante el acto de dicho toying, que necesitaba crear y probar un destino de instalación. Eclipse no genera para usted ni proporciona una interfaz para una configuración para personalizar o agregar un destino de instalación; Aparte de un lugar donde puede especificar que existe otro objetivo.

De manera técnicamente, Eclipse proporciona una interfaz; un poco Por lo tanto, tropecé con makefile.init, makefile.defs y archivos makefile.targets.

proceso/flujo de trabajo:

  • Crear un archivo makefile.targets en el directorio raíz del proyecto Eclipse; En dicho archivo, defina un destino de instalación manualmente. Esto, por supuesto, le permite especificar cada pequeño detalle como desee, pero con el beneficio adicional de que toda la configuración proporcionada por Eclipse ya está completa y disponible para usarla al definir las reglas para el objetivo especificado.

  • Después de definir el nuevo destino en el archivo makefile.targets, clic derecho en el nombre de su proyecto o archivo principal CPP en Eclipse de project explorer, y luego seleccione Make Targets ->Build..., y finalmente Add para crear instancias de un pop-up. Alternativamente, podría seleccionar 'crear' en el último paso en lugar de 'compilar' y proporcionaría la misma ventana emergente requerida para la siguiente parte. añadir el nombrede su nuevo destino y - dejar todo lo demás en sus valores por defecto - hacer clic ok

  • Si decide añadir el nuevo objetivo maquillaje por clic derecho en en Explorador de proyectos y seleccionando hacer objetivo -> Build ... , después de la adición de el nuevo objetivo maquillaje se le llevará de nuevo a la primera ventana emergente que resultó de la selección Build .... De lo contrario, encuentre su camino al Make Targets ->Build.. pop-up ahora. Seleccione el objetivo deseado y luego haga clic en Build.

Mirando a través de los archivos make generados automáticamente de Eclipse fue una excelente manera de aprender la sintaxis y la estructura general makefile, y entrar en un cierto uso avanzado de incluye y condicionales.

Estas son algunas porciones de un ejemplo makefile, que - al menos eso espero - demostrará manualmente configurar el directorio de salida de una construcción:

prefix = /usr/local 
bindir = $(prefix)/bin 
sharedir = $(prefix)/share 
mandir = $(sharedir)/man 
man1dir = $(mandir)/man1 

... 
# Typical all target 
all: <binaryname> 

#Typical clean target 
clean: 
rm -f <binaryname> <objectname>.o 

# Target invokes all, then installs to specified locations 
install: all 
install <binaryname> $(DESTDIR)$(bindir) 
install -m 0644 <objectname>.1 $(DESTDIR)$(man1dir) 
1

Ir al proyecto Propiedades -> C/C++ Build -> Ajustes-> pestaña GCC C++ Enlazador
el patrón de línea de comandos se muestra en el lado derecho

${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX} ${OUTPUT} ${INPUTS} 

poner delante de ${OUTPUT}

${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX} ${ProjDirPath}/bin/${OUTPUT} ${INPUTS} 

o

${COMMAND} ${FLAGS} ${OUTPUT_FLAG}${OUTPUT_PREFIX} MyMainProject/path/bin/ ${INPUTS} 

De https://www.eclipse.org/forums/index.php?t=msg&th=207500&goto=665566&#msg_665566

1

En mi proyecto de los valores predeterminados de la ruta de compilación al nombre configuración de generación, así que podría utilizar un $ {ConfigNombre } macro para recuperar la ruta de compilación en un paso posterior a la compilación:

${workspace_loc:/${ProjName}}/${ConfigName}/${BuildArtifactFileName} 

Luego puede copiar los binarios de destino en su carpeta binaria común, o hacer otra cosa en la carpeta de compilación de esa configuración en particular.

Cuestiones relacionadas