7

C++ (emacs24 + ビルトイン CEDET) 用の EDE プロジェクトをセットアップしようとしていますが、makefile を生成する方法が見つからないようで、必死になり始めています。私はEmacsに比較的慣れていません。私がやっていることを説明しようとします:

私はおもちゃのプロジェクトを次のように設定しています:

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

main.cpp には、「other/」ディレクトリ内に両方の .h が含まれています。これらは、この単純なディレクトリ設定で EDE プロジェクトを設定するために従う手順です。

  • emacs で main.cpp を開いて実行しM-x ede-newます。タイプ: Make; 名前: main-proj
  • 「他の」ディレクトリにあるファイルの 1 つを開き、次の操作を行いますM-x ede-new。タイプ: Make; 名前: aux-proj
  • 次に、ターゲットを作成します (この場合は 3 つだと思います)。
    • main.cpp バッファー: M-x ede-new-target; 名前: main; タイプ: program。プロンプトが表示されたら、main.cpp をこのターゲットに追加します。
    • 他の 2 つのターゲット (Utils.cpp と Utils.h を持つ Utils、および CGrabBuffer.cpp と CGrabBuffer.h を持つ CGrabBuffer) についても同じことを繰り返します。ここで、最初の問題を見つけます。これらの 2 つのターゲットはどのタイプである必要がありますか? 私は彼らに .o ファイルを生成させたいだけです。
  • これが完了したら、M-x ede-customize-current-target3 つのターゲットすべてに入力し、いくつかのインクルード パスやライブラリなどを追加します。
  • この後、呼び出しM-x ede-compile-projectてもコンパイルされません。理由は次のとおりです。
    • 最初に main.cpp をコンパイルしようとします。main.cpp をビルドする前に Utils.o と CGrabBuffer.o の両方が必要であることを (EDE を使用して) 指定する方法がわかりません。
    • 手動で順序を変更すると (Makefile を編集して)、Utils.o と CGrabBuffer.o が見つからないため、main.cpp をリンクできません。

ご覧のとおり、私は大混乱の真っ只中にいます。EDE での「ターゲット」の意味さえ理解していないのかもしれません。.emacs ファイル内で指定する必要がある ede-cpp-root-project の存在についても読みました。私はそれを試していない. Makefile は生成されませんね。Project.el で構築された EDE プロジェクトと、セマンティクスに ede-cpp-root-project を使用した同じものを使用できますか (または必要ですか)? それとも冗長ですか?

私が多くのことを誤解していたら申し訳ありませんが、私は非常に混乱しており、emacs に慣れていないため、事態はさらに悪化しています。お待ち頂きまして、ありがとうございます!

編集:いくつかのいじくり回しと私が受け取った応答で、私は多くのものを理解することができたので、どうもありがとう. 私がまだ理解していないのは、.emacs ファイル内で指定する必要がある ede-cpp-root-project の使用です。それはC ++セマンティクスのためだけですか? Project.el と .emacs の elisp 行を含むプロジェクトを持つことは冗長ですか?

4

2 に答える 2

8

EDE は、多くの異なる種類のプロジェクトを処理するように設計されています。通常は、ビルド システムが Emacs の外部で他のツールで作成されたタイプのものです。

Makefile を作成する EDE プロジェクト タイプは、かなり多くのことを実行できますが、それが役立つようにするには、ビルド システムの基本的な理解が必要であり、複雑なものを機能させるにはプロジェクトをカスタマイズする必要があります。

私は最近、Automake ファイルを自動生成する基本的なプロジェクトのセットアップに役立つセクションを EDE マニュアルに追加しました。ここでチュートリアルを確認できます。

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

代わりに Make のみを使用するプロジェクトにも同じ手順が適用されますが、Make ベースのプロジェクトでは、複雑さが増すために共有ライブラリに問題が生じることがよくあります。

マイクの答えはかなり良いですが、.h ファイルを.cppソースと同じターゲットに追加するだけで問題ないと思います。それらを個別に追跡します。

もう 1 つの便利なトリックは、プロジェクト全体のコンパイル キーストローク (Cc . C) を使用することです。これは、大きな変更を行うたびに大文字の C を使用します。これにより、Makefile が再生成され、必要な Automake 機能が再実行され、先頭から開始されます。

EDIT : 特定のプロジェクト領域に対して 1 つの EDE プロジェクトのみが必要です。ede-cpp-root プロジェクトは、他の自動プロジェクト タイプが機能しない場合に役立ちます。それは、セマンティックのスマート補完やタグ検索など、プロジェクト定義を必要とする他のツールが機能するように、.emacs ファイルでそれを作成するときです。

于 2012-02-24T05:09:26.813 に答える
3

いや、今回はちゃんと解ったと思うんですけど、醜いです。 適切なターゲット タイプがないように思われるため、独自の個々のターゲットを取得するべきではありませんUtils.cppCGrabBuffer.cpp代わりに、自動的にコンパイルされるアーカイブまたはライブラリを作成する必要がありUtils.cppますCGrabBuffer.cpp。以下では、静的が必要であると仮定しますが、変更は簡単です。

[アーカイブやライブラリになじみのない人のために説明すると、それらは基本的に.oファイルを別のユニットにまとめているだけです。実際にはコンパイルが難しくなりません。詳細はこちら]

1) 上記の最初の 2.5 ステップに従います (ターゲットの作成を含みますmainが、他のターゲットは作成しません)。

2) Utils.cpp に切り替えて実行しますM-x ede-new-target。名前: aux; タイプ: archive。プロンプトが表示されたら、Utils.cpp をこのターゲットに追加します。

3) CGrabBuffer.cpp に切り替えて実行しますC-c . a。ターゲット: aux

4) で Makefile を再生成しM-x ede-proj-regenerateます。この時点で、サブディレクトリで実行するmakeother、アーカイブが取得されますlibaux.a

5) main.cpp に戻り、実行しますM-x ede-customize-current-target。これにより、対話型の emacs カスタマイズ バッファーが表示され、ede 構成の詳細を編集できます。Ldflagsセクションの下で、 をクリックします[INS]。これにより、入力するための異なる色のボックスがあるという新しい行がLink Flag:表示されます(私の場合は灰色です)。タイプ-Lother -lauxなので、other/libaux.aコンパイル時に含まれmainます。次に、バッファの上部で を押し[Accept]ます。これにより、その変更が保存され、main.cpp に戻ります。

6) で Makefile を再生成しM-x ede-proj-regenerateます。

残念ながら、Makefile は最初にターゲットを作成し、次にディレクトリmainに降りてそれを作成します。other残念ながら、これは最上位ディレクトリからの make はクリーンなツリーでは機能しないことを意味します。これがなぜなのかはわかりません。これまでに EDE で作成されたプロジェクトでは、決して望んでいないように思われるからです。このハックを除いて、それを変更する方法が見つかりません:

7) するM-x customize-project; 下の をInference-Rulesクリックしてください[INS]。次に、Target: を入力しますall。依存関係: aux main; ルール: [INS]; 文字列@:。(この最後のものは、タブのある空のルールでのエラーを防ぐためのものです。おそらく EDE のバグです。) をクリックし[Accept]て、Makefile を再生成します。

これで、最上位ディレクトリで make を実行するだけでmain、動作する実行可能ファイルになるはずです。

私はすぐに、EDE がその作成者以外の人々によって使用される準備ができていないことを確信するようになりました。そのサイズと彼らが明らかにそれに費やした労力にもかかわらず、それはあまりにもバグが多く、直感に反しすぎており、十分にスマートではありません. 残念です。Emacsにはこのようなものが必要です。

于 2012-02-23T19:17:23.573 に答える