2012-02-21 22 views
7

He estado intentando configurar un proyecto EDE para C++ (emacs24 + CEDET incorporado) y estoy empezando a desesperarme porque parece que no puedo encontrar el camino que quiero. makefiles para ser generado. Soy relativamente nuevo en Emacs. voy a tratar de describir lo que estoy haciendo:Cómo crear un proyecto EDE para C++

Tengo un proyecto conjunto de juego de este modo:

main.cpp 
other/ 
    Utils.cpp 
    Utils.h 
    CGrabBuffer.cpp 
    CGrabBuffer.h 

main.cpp incluye tanto de .h dentro del directorio "otro /". Estos son los pasos que sigo para establecer un proyecto de EDE con esta sencilla configuración de directorios:

  • main.cpp Abrir en emacs y hacer M-x ede-new; tipo: Make; nombre: main-proj.
  • Abra uno de los archivos en el "otro" directorio y haga M-x ede-new; tipo: Make; nombre: aux-proj.
  • Ahora es el momento de crear los objetivos (que creo que son tres en este caso):
    • En el buffer main.cpp: M-x ede-new-target; nombre: main; tipo: program. Cuando se le solicite, agrego main.cpp a este objetivo.
    • Repito lo mismo para los otros dos objetivos (Utils que tiene Utils.cpp y Utils.h y CGrabBuffer que tiene CGrabBuffer.cpp y CGrabBuffer.h). Aquí encuentro el primer problema. ¿Qué tipo de estos dos objetivos tienen que ser? Solo quiero que generen archivos .o.
  • Una vez hecho esto, yo escriba M-x ede-customize-current-target a los tres objetivos y agrego algunos incluyen caminos, algunas bibliotecas, etc.
  • Después de esto, si llamo M-x ede-compile-project no se compila porque:
    • Intenta compilar main.cpp primero; No tengo idea de cómo especificar (usando EDE) que tanto Utils.o como CGrabBuffer.o son necesarios antes de intentar construir main.cpp.
    • Si cambio manualmente el orden (editando el Makefile), no puede vincular main.cpp porque no puede encontrar Utils.o y CGrabBuffer.o.

Como se puede ver, estoy en medio de un gran desorden. Tal vez ni siquiera estoy entendiendo qué significa "objetivo" en EDE. También he leído sobre la existencia de ede-cpp-root-project que debe especificarse dentro del archivo .emacs. No lo he intentado porque lo que creo que es solo ayuda con la semántica. No genera Makefiles, ¿verdad? ¿Puedo tener (o necesito) un proyecto EDE creado con Project.el's y lo mismo usando ede-cpp-root-project para la semántica? ¿O es redundante?

Lo siento si he entendido mal muchas cosas, pero estoy muy confundido y ser nuevo en emacs empeora las cosas. ¡Gracias por su paciencia!

EDIT: con algunas modificaciones y las respuestas que recibí he podido descifrar un montón de cosas, así que muchas gracias. Lo que aún no entiendo es el uso del proyecto ede-cpp-root, que debe especificarse dentro del archivo .emacs. ¿Es solo para semántica C++? ¿Es redundante tener el proyecto AND de Project.el y también las líneas elisp en .emacs?

+1

Estoy usando CEDET pero no puedo entender su soporte de proyecto para mi vida. Solo uso archivos Makefiles externos y agrego el tipo de proyecto "simple" en la parte superior de eso. –

+0

Sí, y eso es lo único que hace que me quede con otros IDEs como Eclipse que te permiten administrar todo esto de manera más fácil ... – pparescasellas

+0

Gran pregunta. He pasado los últimos días tratando de hacer funcionar este tipo de cosas, pero justo cuando pienso que estoy llegando a algo, todo se derrumba. Decir que EDE está pobremente documentado es una subestimación. – Mike

Respuesta

7

EDE está diseñado para manejar diferentes tipos de proyectos, generalmente de un tipo en el que el sistema de compilación se escribió fuera de Emacs en alguna otra herramienta.

El tipo de proyecto EDE que crea Makefiles para usted puede hacer bastantes cosas, pero necesita tener un conocimiento básico de los sistemas de compilación para que sea útil, y realmente necesita personalizar los proyectos para obtener algo de cualquier complejidad trabajando.

Recientemente he agregado una sección al manual de EDE para ayudar con las configuraciones básicas del proyecto que autogeneran los archivos de Automake. Se puede extraer el tutorial aquí:

http://www.randomsample.de/cedetdocs/ede/ede/Quick-Start.html

Los mismos pasos se aplican a proyectos que acaba de uso hacen en su lugar, pero hacen que los proyectos basados ​​a menudo tienen problemas con las bibliotecas compartidas debido a la complejidad adicional.

La respuesta de Mike es bastante buena, pero creo que está bien solo agregar archivos .h al mismo destino que sus fuentes .cpp. Hará un seguimiento de ellos por separado.

Otro truco útil es utilizar todo el proyecto compilar con la combinación de teclas (C-c. C) que utiliza una C mayúscula cada vez que cambia algo grande. Eso regenerará los Makefiles, volverá a ejecutar cualquier característica necesaria de Automake y comenzará en la parte superior.

EDIT: Solo necesita un proyecto EDE para un área de proyecto. El proyecto ede-cpp-root es útil cuando no funciona otro tipo de proyecto automático. Es entonces cuando crea eso en su archivo .emacs para que funcionen las otras herramientas que necesitan una definición de proyecto, como la terminación inteligente de semántica y la búsqueda de etiquetas.

+1

Ese tutorial es lo que estaba buscando hace unas semanas, cuando empecé a echarle un primer vistazo a EDE, pero no pude encontrar nada parecido. Es muy útil y a los nuevos usuarios les va a encantar la información, así que muchas gracias :) – pparescasellas

+0

Eric, lo que falta en ese tutorial es cualquier descripción de cómo usar realmente el tipo 'ede-cpp-root-project'. Para cuando llegas a esa parte del manual, ves elementos no centrados en el usuario como subclases de eieio, etc. ¿Se configura un archivo de proyecto, por ejemplo? ¿Cómo se configuran las cosas con ese tipo de proyecto? –

+1

El enlace está roto y debe actualizarse a http://www.randomsample.de/cedetdocs/ede/Quick-Start.html Traté de editar, pero hay una regla tonta sobre ediciones que necesitan tener más de 6 caracteres. – nispio

3

Bueno, creo que de hecho lo he descifrado esta vez, pero es feo.Utils.cpp y CGrabBuffer.cpp no deberían obtener sus propios objetivos individuales, ya que no parece haber un tipo de objetivo apropiado. En su lugar, deberá crear un archivo o biblioteca, que compilará automáticamente Utils.cpp y CGrabBuffer.cpp por usted. A continuación, supongo que quieres estática, pero es fácil de cambiar.

[Para cualquier persona a quien los archivos o bibliotecas no le son familiares, básicamente solo recoge los archivos .o en una unidad separada. En realidad, no hace la compilación más difícil. Leer más here.]

1) Siga los dos primeros pasos y medio anteriores (incluido el objetivo main, pero no los otros objetivos).

2) Cambie a Utils.cpp y haga M-x ede-new-target; nombre: aux; tipo: archive. Cuando se le solicite, agregue Utils.cpp a este destino.

3) Cambie a CGrabBuffer.cpp y haga C-c . a; Objetivo: aux.

4) Regenerar el Makefile con M-x ede-proj-regenerate. En este punto, si ejecuta make en el subdirectorio other, debe obtener el archivo libaux.a.

5) Volver a main.cpp y hacer M-x ede-customize-current-target. Esto abre un búfer de personalización de emacs interactivo, que le permite editar detalles de la configuración de ede. En la sección Ldflags, haga clic en [INS]. Aparece una nueva línea que dice Link Flag: y tiene una caja de diferentes colores para que escriba (la mía es gris). Escriba -Lother -laux, de modo que se incluye other/libaux.a al compilar main. Luego, en la parte superior del búfer, presione [Accept], que debe guardar ese cambio y volver a main.cpp.

6) Regenerar el Makefile con M-x ede-proj-regenerate.

Ahora, desafortunadamente, el Makefile hace que el objetivo main primero, luego desciende al directorio other y lo hace. Desafortunadamente, esto significa que una marca del directorio de nivel superior no funcionará en un árbol limpio. No sé por qué es así, porque parece que nunca será lo que quieres en ningún proyecto que se haya hecho con EDE. No puedo encontrar ninguna forma de cambiar eso, excepto por este truco:

7) Do M-x customize-project; debajo de Inference-Rules haga clic en [INS]. Luego ingrese Target: all; Dependencias: aux main; Reglas: [INS]; Cadena @:. (Esta última es solo para evitar un error en una regla vacía con una pestaña, presumiblemente un error EDE). Haga clic en [Accept] y regenere los Makefiles.

Así que ahora, en su directorio superior, puede simplemente ejecutar make, y main debe ser un ejecutable de trabajo.

Me estoy convenciendo rápidamente de que EDE aún no está listo para ser utilizado por personas que no sean sus autores. A pesar de su tamaño y la cantidad de esfuerzo que claramente han puesto en él, es demasiado defectuoso, demasiado contrario a la intuición, y simplemente no lo suficientemente inteligente. Es una pena. Emacs necesita algo como esto.

+0

Después de hacer la pregunta, seguí retocando con los tipos de proyecto y terminé haciendo algo similar a lo que dices. Hice dos objetivos de tipo archivo (uno para CGrabBuffer y otro para Utils) en lugar de uno. Y, como dices, primero tuve que llamar a 'make' en el directorio' other'. Esta forma de proceder parece "rara" pero funciona :). – pparescasellas

+0

El nuevo tutorial de Eric es definitivamente muy útil. En particular, parece que usar Automake resolverá muchos de estos problemas. Dicho esto, me di cuenta de que también podrías incluir 'other/Utils.cpp' y' other/CGrabBuffer.cpp' como fuentes en el objetivo 'main', y se construirán correctamente. Ni siquiera necesita objetivos separados para ellos. – Mike

Cuestiones relacionadas