2012-02-21 19 views
7

Ho cercato di impostare un progetto EDE per C++ (emacs24 + CEDET integrato) e sto iniziando a disperarmi perché non riesco a trovare il modo in cui voglio makefile da generare. Sono relativamente nuovo a Emacs. Cercherò di descrivere quello che sto facendo:Come creare un progetto EDE per C++

Ho un progetto giocattolo stabilito in questo modo:

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

main.cpp comprende sia .h di dentro "l'altro /" directory. Questi sono i passi seguo per impostare un progetto EDE con questa semplice configurazione directory:

  • aperto main.cpp in emacs e fare M-x ede-new; digitare: Make; nome: main-proj.
  • Aprire uno dei file nella "altra" directory e fare M-x ede-new; digitare: Make; nome: aux-proj.
  • Ora è il momento di creare gli obiettivi (che ritengo tre in questo caso):
    • sul buffer main.cpp: M-x ede-new-target; nome: main; tipo: program. Quando richiesto, aggiungo il main.cpp a questo target.
    • Ripeto lo stesso per gli altri due target (Utils che ha Utils.cpp e Utils.h e CGrabBuffer che ha CGrabBuffer.cpp e CGrabBuffer.h). Qui trovo il primo problema. Che tipo devono essere questi due obiettivi? Voglio solo che generino file .o.
  • Una volta fatto questo, ho digitare M-x ede-customize-current-target a tutti e tre gli obiettivi e aggiungo un po 'di percorsi di inclusione, alcune librerie, ecc
  • Dopo di ciò, se chiamo M-x ede-compile-project esso non compilato perché:
    • Prova a compilare main.cpp prima; Non ho idea di come specificare (usando EDE) che sia Utils.o che CGrabBuffer.o siano necessari prima di provare a costruire main.cpp.
    • Se cambio manualmente l'ordine (modificando il Makefile), non è in grado di collegare main.cpp perché non riesce a trovare Utils.o e CGrabBuffer.o.

Come potete vedere, io sono nel bel mezzo di un grande pasticcio. Forse non sto nemmeno capendo cosa significa "bersaglio" in EDE. Ho anche letto dell'esistenza di ede-cpp-root-project che deve essere specificato nel file .emacs. Non l'ho provato perché quello che penso che faccia è solo un aiuto con la semantica. Non genera Makefile, vero? Posso avere (o ho bisogno) un progetto EDE costruito con Project.el e la stessa cosa usando ede-cpp-root-project per la semantica? O è ridondante?

Scusa Se ho frainteso un sacco di cose, ma sono molto confuso e essere nuovo in Emac rende le cose peggiori. Grazie per la vostra pazienza!

MODIFICA: con un po 'di armeggiare e le risposte che ho ricevuto sono stato in grado di capire un sacco di cose, quindi grazie mille. Quello che ancora non capisco è l'uso del progetto ede-cpp-root che deve essere specificato nel file .emacs. È solo per la semantica C++? È ridondante avere il progetto con AND di Project.el anche le linee elisp in .emacs?

+1

Sto usando CEDET ma non riesco a capire il supporto del progetto per la mia vita. Io uso solo Makefile esterni e aggiungo il tipo di progetto "semplice" in cima a quello. –

+0

Sì, e questa è l'unica cosa che mi fa rimanere attaccato ad altri IDE come Eclipse che ti permettono di gestire tutto questo più facilmente ... – pparescasellas

+0

Ottima domanda. Ho passato gli ultimi giorni a cercare di far funzionare questo genere di cose, ma proprio quando penso di andare da qualche parte, tutto si sgretola. Dire che EDE è scarsamente documentato è un eufemismo. – Mike

risposta

7

EDE è progettato per gestire molti diversi tipi di progetti, di solito di un tipo in cui il sistema di compilazione è stato scritto al di fuori di Emacs in qualche altro strumento.

Il tipo di progetto EDE che crea i Makefile per voi può fare un bel po 'di cose, ma è necessario avere una conoscenza di base dei sistemi di compilazione perché sia ​​utile, e avete davvero bisogno di personalizzare i progetti per ottenere qualcosa di qualsiasi complessità funzionante.

Ho recentemente aggiunto una sezione al manuale EDE per aiutare con le impostazioni di base del progetto che generano automaticamente i file Automake. È possibile controllare il tutorial qui: si applicheranno

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

la stessa procedura per i progetti che fanno uso solo posto, ma fare progetti basati spesso hanno problemi con le librerie condivise a causa della complessità supplementare.

La risposta di Mike è abbastanza buona, ma penso che sia giusto aggiungere solo i file .h allo stesso obiettivo delle sorgenti .cpp. Terrà conto di loro separatamente.

Un altro trucco utile è utilizzare l'intero comando di compilazione del progetto (C-C) che utilizza la C maiuscola ogni volta che si modifica qualcosa di grande. Questo rigenererà i Makefile, eseguirà nuovamente tutte le funzionalità di Automake necessarie e inizierà in cima.

EDIT: è necessario un solo progetto EDE per un'area di progetto. Il progetto ede-cpp-root è utile quando nessun altro tipo di progetto automatico funziona. Questo è il momento in cui lo crei nel tuo file .emacs in modo che funzionino gli altri strumenti che richiedono una definizione del progetto, come il completamento intelligente della semantica e la ricerca di tag.

+1

Quel tutorial è quello che stavo cercando da qualche settimana, quando ho iniziato a dare una prima occhiata a EDE, ma non riuscivo a trovare nulla di simile. È molto utile e i nuovi utenti adoreranno le informazioni lì, quindi grazie mille :) – pparescasellas

+0

Eric, quello che manca da quel tutorial è una qualsiasi descrizione di come utilizzare effettivamente il tipo 'ede-cpp-root-project'. Nel momento in cui arrivi a quella parte del manuale vedi cose non centrate sull'utente come le sottoclassi di eieio, ecc. Si crea un file di progetto, ad esempio? Come si impostano effettivamente le cose con quel tipo di progetto? –

+1

Il collegamento è danneggiato e dovrebbe essere aggiornato a http://www.randomsample.de/cedetdocs/ede/Quick-Start.html Ho provato a modificare, ma c'è una regola stupida sulle modifiche che richiedono più di 6 caratteri. – nispio

3

Beh, penso che questa volta l'ho capito, ma è brutto.Utils.cpp e CGrabBuffer.cpp non dovrebbero ottenere i propri obiettivi individuali, perché non sembra essere un tipo di destinazione appropriato. Invece, dovrai creare un archivio o una libreria, che compilerà automaticamente Utils.cpp e CGrabBuffer.cpp per te. Sotto, presumo che tu voglia statico, ma è facile da cambiare.

[Per chiunque a cui gli archivi o le librerie non siano familiari, in pratica raccolgono semplicemente i file .o in un'unità separata. In realtà non rende più difficile la compilazione. Per saperne di più here.]

1) Seguire i primi due passi e mezzo sopra (incluso fare il bersaglio main, ma non gli altri bersagli).

2) Passare a Utils.cpp e fare M-x ede-new-target; nome: aux; tipo: archive. Quando richiesto, aggiungi Utils.cpp a questo target.

3) Passare a CGrabBuffer.cpp e fare C-c . a; Target: aux.

4) Rigenera il Makefile con M-x ede-proj-regenerate. A questo punto, se si esegue make nella sottodirectory other, è necessario ottenere l'archivio libaux.a.

5) Passare a main.cpp e fare M-x ede-customize-current-target. Questo fa apparire un buffer di personalizzazione emacs interattivo, che consente di modificare i dettagli della configurazione di ede. Nella sezione Ldflags, fare clic su [INS]. Questo apre una nuova riga che dice Link Flag: e ha qualche scatola di diverso colore da digitare (il mio è grigio). Digitare -Lother -laux, in modo che other/libaux.a sia incluso durante la compilazione di main. Quindi, nella parte superiore del buffer, premere [Accept], che dovrebbe salvare tale modifica e tornare a main.cpp.

6) Rigenera il Makefile con M-x ede-proj-regenerate.

Ora, sfortunatamente, il Makefile effettua prima il target main, quindi scende nella directory other e lo fa. Sfortunatamente, ciò significa che un make dalla directory di primo livello non funzionerà su un albero pulito. Non so perché sia ​​così, perché sembra che non sarebbe mai quello che vuoi in qualsiasi progetto che sia mai stato realizzato con EDE. Non riesco a trovare alcun modo per cambiarlo, ad eccezione di questo trucco:

7) Do M-x customize-project; sotto Inference-Rules fare clic su [INS]. Quindi inserire Target: all; Dipendenze: aux main; Regole: [INS]; String @:. (Quest'ultimo serve solo a prevenire un errore su una regola vuota con una scheda, presumibilmente un bug EDE.) Fare clic su [Accept] e rigenerare i Makefile.

Così ora, nella tua directory principale, puoi semplicemente eseguire make, e main dovrebbe essere un eseguibile funzionante.

Mi sto rapidamente convincendo che EDE non è ancora pronto per essere utilizzato da persone diverse dai suoi autori. Nonostante le sue dimensioni e la quantità di sforzi che hanno chiaramente messo in esso, è troppo buggato, troppo poco intuitivo e non abbastanza intelligente. È un peccato. Emacs ha bisogno di qualcosa del genere.

+0

Dopo aver fatto la domanda ho continuato a armeggiare con i tipi di progetto e ho finito per fare qualcosa di simile a quello che dici. Ho creato due obiettivi di tipo archivio (uno per CGrabBuffer e l'altro per Utils) anziché uno. E, come dici tu, dovevo prima chiamare 'make' nella directory' other'. Questo modo di procedere sembra "strano" ma funziona :). – pparescasellas

+0

Il nuovo tutorial di Eric è sicuramente molto utile. In particolare, sembra che usare Automake risolverà molti di questi problemi. Detto questo, ho capito che potresti anche includere "altro/Utils.cpp" e "altro/CGrabBuffer.cpp" come sorgenti nella destinazione "principale", e verranno compilati correttamente. Non hai nemmeno bisogno di obiettivi separati per loro. – Mike

Problemi correlati