Как создать проект EDE для C++

Я пытался настроить проект EDE для C++ (emacs24 + встроенный CEDET), и я начинаю впадать в отчаяние, потому что, похоже, не могу найти способ создания make-файлов. Я относительно новичок в Emacs. Я постараюсь описать, что я делаю:

У меня есть игрушечный проект:

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

main.cpp включает оба файла .h в каталог «other/». Вот шаги, которые я выполняю, чтобы настроить проект EDE с этой простой настройкой каталога:

  • Откройте main.cpp в emacs и выполните M-x ede-new ; тип: Make ; имя: main-proj.
  • Откройте один из файлов в «другом» каталоге и выполните M-x ede-new ; тип: Make ; имя: aux-proj.
  • Now it's time to create the targets (which I believe are three in this case):
    • On the main.cpp buffer: M-x ede-new-target ; name: main ; type: program. When prompted, I add the main.cpp to this target.
    • Я повторяю то же самое для двух других целей (Utils с Utils.cpp и Utils.h и CGrabBuffer с CGrabBuffer.cpp и CGrabBuffer.h). Здесь я нахожу первую проблему. Какого типа должны быть эти две цели? Я только хочу, чтобы они генерировали файлы .o.
  • Как только это будет сделано, я наберу M-x ede-customize-current-target для всех трех целей и добавлю некоторые включаемые пути, некоторые библиотеки и т. д.
  • After this, if I call M-x ede-compile-project it doesn't compile because:
    • It tries to compile main.cpp first; I have no idea how to specify (using EDE) that both Utils.o and CGrabBuffer.o are needed before attempting to build main.cpp.
    • Если я вручную изменю порядок (редактируя Makefile), он не сможет связать main.cpp, потому что не сможет найти Utils.o и CGrabBuffer.o.

Как видите, я в центре большого беспорядка. Может быть, я даже не понимаю, что означает «цель» в EDE. Я также читал о существовании ede-cpp-root-project, который необходимо указать внутри файла .emacs. Я не пробовал это, потому что я думаю, что это просто помогает с семантикой. Он не генерирует файлы Makefile, не так ли? Могу ли я иметь (или мне нужен) проект EDE, созданный с помощью Project.el, и то же самое с использованием ede-cpp-root-project для семантики? Или это лишнее?

Извините, если я неправильно понял много вещей, но я очень запутался, а то, что я новичок в emacs, усугубляет ситуацию. Спасибо за терпеливость!

РЕДАКТИРОВАТЬ: немного поработав и получив ответы, я смог разобраться во многих вещах, так что большое спасибо. Чего я до сих пор не понимаю, так это использования ede-cpp-root-project, который должен быть указан внутри файла .emacs. Это только для семантики С++? Является ли излишним иметь проект с Project.el, а также строки elisp в .emacs?


person pparescasellas    schedule 21.02.2012    source источник
comment
Я использую CEDET, но не могу понять его проектную поддержку для моей жизни. Я просто использую внешние файлы Makefile и добавляю к ним простой тип проекта.   -  person Laurynas Biveinis    schedule 21.02.2012
comment
Да, и это единственное, что заставляет меня придерживаться других IDE, таких как Eclipse, которые позволяют вам управлять всеми этими вещами намного проще...   -  person pparescasellas    schedule 22.02.2012
comment
Отличный вопрос. Я провел последние несколько дней, пытаясь заставить такую ​​штуку работать, но как только я думаю, что добился чего-то, все рушится. Сказать, что EDE плохо документирован, значит ничего не сказать.   -  person Mike    schedule 23.02.2012


Ответы (2)


EDE предназначен для обработки многих различных типов проектов, обычно таких, где система сборки была написана вне Emacs в каком-либо другом инструменте.

Тип проекта EDE, который создает для вас файлы Makefile, может делать довольно много вещей, но вам нужно иметь некоторое базовое представление о системах сборки, чтобы он был полезен, и вам действительно нужно настраивать проекты, чтобы заставить работать что-либо любой сложности.

Недавно я добавил раздел в руководство EDE, чтобы помочь с базовыми настройками проекта, которые автоматически генерируют файлы Automake. Вы можете проверить учебник здесь:

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

Те же шаги применимы к проектам, которые просто используют Make, но у проектов на основе Make часто возникают проблемы с общими библиотеками из-за дополнительной сложности.

Ответ Майка довольно хорош, но я думаю, что можно просто добавить файлы .h к той же цели, что и ваши источники .cpp. Он будет отслеживать их отдельно.

Еще один полезный прием — использовать комбинацию клавиш компиляции всего проекта (C-c .C), которая использует заглавную C всякий раз, когда вы меняете что-то большое. Это приведет к регенерации файлов Makefile, повторному запуску всех необходимых функций Automake и запуску с самого начала.

EDIT: вам нужен только один проект EDE для данной области проекта. Проект ede-cpp-root полезен, когда никакие другие автоматические типы проектов не работают. Это когда вы создаете это в своем файле .emacs, чтобы другие инструменты, которым требуется определение проекта, такие как интеллектуальное завершение семантики и поиск тегов, работали.

person Eric    schedule 24.02.2012
comment
Это руководство — то, что я искал несколько недель назад, когда начал впервые знакомиться с EDE, но ничего подобного не нашел. Это очень полезно, и новым пользователям понравится эта информация, так что большое спасибо :) - person pparescasellas; 24.02.2012
comment
Эрик, в этом руководстве не хватает какого-либо описания того, как на самом деле использовать тип ede-cpp-root-project. К тому времени, когда вы дойдете до этой части руководства, вы увидите не ориентированные на пользователя вещи, такие как подклассы eieio и т. д. Например, можно ли настроить файл проекта? Как вы на самом деле настраиваете вещи с этим типом проекта? - person Dave Abrahams; 19.09.2012
comment
Ссылка не работает и должна быть обновлена ​​до randomsample.de/cedetdocs/ede/Quick -Start.html Я попытался отредактировать, но существует глупое правило о том, что редактирование должно содержать более 6 символов. - person nispio; 24.09.2014

Ну, я думаю, что на этот раз я действительно понял это, но это уродливо. Utils.cpp и CGrabBuffer.cpp не должны получать свои собственные цели, потому что, похоже, не существует подходящего типа цели. Вместо этого вам потребуется создать архив или библиотеку, которая автоматически скомпилирует для вас Utils.cpp и CGrabBuffer.cpp. Ниже я предполагаю, что вам нужна статика, но ее легко изменить.

[Для тех, кто не знаком с архивами или библиотеками, они в основном просто собирают .o файлов в отдельный блок. На самом деле это не усложняет компиляцию. Подробнее читайте здесь.]

1) Выполните первые два с половиной шага выше (включая создание цели 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. На этом этапе, если вы запустите make в подкаталоге other, вы должны получить архив 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]. Затем введите Цель: all ; Зависимости: aux main ; Правила: [INS] ; Строка @: . (Последнее просто для предотвращения ошибки в пустом правиле с вкладкой; предположительно, ошибка EDE.) Щелкните [Accept] и заново создайте файлы Makefile.

Итак, теперь в вашем верхнем каталоге вы можете просто запустить make, и main должен быть работающим исполняемым файлом.

Я быстро убеждаюсь, что EDE еще не готов к использованию другими людьми, кроме его авторов. Несмотря на его размер и количество усилий, которые они явно вложили в него, он слишком забагован, слишком нелогичен и просто недостаточно умен. Это позор. Emacs нужно что-то вроде этого.

person Mike    schedule 23.02.2012
comment
Задав вопрос, я продолжил возиться с типами проектов и в итоге сделал что-то похожее на то, что вы говорите. Я сделал две цели типа archive (одну для CGrabBuffer и другую для Utils) вместо одной. И, как вы сказали, сначала мне пришлось вызвать make в каталоге other. Этот способ действий кажется странным, но он работает :). - person pparescasellas; 24.02.2012
comment
Новый учебник Эрика определенно очень полезен. В частности, похоже, что использование Automake решит многие из этих проблем. Тем не менее, я понял, что вы также можете просто включить other/Utils.cpp и other/CGrabBuffer.cpp в качестве источников в цель main, и они будут построены правильно. Для них даже не нужны отдельные цели. - person Mike; 24.02.2012