Как создать проект EDE для C ++ - PullRequest
7 голосов
/ 21 февраля 2012

Я пытался настроить проект 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;name: aux-proj.
  • Теперь пришло время создать цели (в этом случае я считаю, что их три):
    • В буфере main.cpp: M-x ede-new-target;имя: main;Тип: program.При появлении запроса я добавляю main.cpp к этой цели.
    • Я повторяю то же самое для двух других целей (Utils, которая имеет Utils.cpp и Utils.h и CGrabBuffer, которая имеет CGrabBuffer.cpp и CGrabBuffer.h).Здесь я нахожу первую проблему.Какого типа должны быть эти две цели?Я только хочу, чтобы они генерировали файлы .o.
  • Как только это будет сделано, я набираю M-x ede-customize-current-target для всех трех целей и добавляю несколько путей включения, некоторые библиотеки и т. Д.
  • После этого, если я вызову M-x ede-compile-project, он не скомпилируется, потому что:
    • Сначала он пытается скомпилировать main.cpp;Я понятия не имею, как указать (используя EDE), что Utils.o и CGrabBuffer.o необходимы перед попыткой сборки main.cpp.
    • Если я вручную изменяю порядок (редактируя Makefile), это несмог связать main.cpp, потому что он не может найти Utils.o и CGrabBuffer.o.

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

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

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

Ответы [ 2 ]

7 голосов
/ 24 февраля 2012

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

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

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

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

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

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

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

РЕДАКТИРОВАТЬ : Вам нужен только один проект EDE для данной области проекта. Проект ede-cpp-root полезен, когда другой автоматический тип проекта не работает. Именно тогда вы создадите его в своем файле .emacs, чтобы сработали другие инструменты, которым необходимо определение проекта, например, умное завершение семантики и поиск тегов.

3 голосов
/ 23 февраля 2012

Ну, я думаю, на этот раз я понял это, но это ужасно. 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, чтобы при компиляции main было включено other/libaux.a. Затем в верхней части буфера нажмите [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] и заново создайте Makefiles.

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

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

...