Как создать проект 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
, - Теперь пришло время создать цели (которых я считаю тремя в данном случае):
- В буфере main.cpp:
M-x ede-new-target
; название:main
; тип:program
, При появлении запроса я добавляю main.cpp к этой цели. - Я повторяю то же самое для двух других целей (Utils, который имеет Utils.cpp и Utils.h и CGrabBuffer, который имеет CGrabBuffer.cpp и CGrabBuffer.h). Здесь я нахожу первую проблему. Какого типа должны быть эти две цели? Я только хочу, чтобы они генерировали файлы.o.
- В буфере main.cpp:
- Как только это будет сделано, я печатаю
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 ответа
EDE предназначен для работы с различными проектами, обычно такого типа, когда система сборки была написана вне Emacs в каком-либо другом инструменте.
Тип проекта EDE, который создает файлы Makefile для вас, может сделать довольно много вещей, но вам нужно иметь некоторое базовое понимание систем сборки, чтобы он был полезным, и вам действительно нужно настроить проекты, чтобы заставить работать что-либо любого сложности.
Недавно я добавил раздел в руководство по EDE, чтобы помочь с основными настройками проекта, которые автоматически генерируют файлы Automake. Вы можете проверить учебник здесь:
http://www.randomsample.de/cedetdocs/ede/ede/Quick-Start.html
Те же шаги будут применяться к проектам, которые используют вместо этого только Make, но проекты на основе Make часто имеют проблемы с общими библиотеками из-за дополнительной сложности.
Ответ Майка довольно хороший, но я думаю, что можно просто добавить.h файлы к той же цели, что и ваш .cpp
источники. Он будет отслеживать их отдельно.
Другой полезный трюк заключается в использовании всей клавиши компиляции проекта (Cc . C), которая использует заглавную букву C всякий раз, когда вы меняете что-то большое. Это восстановит Makefiles, перезапустит все необходимые функции Automake и начнёт сверху.
РЕДАКТИРОВАТЬ: Вам нужен только один проект EDE для данной области проекта. Проект ede-cpp-root полезен, когда другой автоматический тип проекта не работает. That's when you create that in your.emacs file so that the other tools that need a project definition, like semantic's smart completion, and tag lookup, will work.
Ну, я думаю, что на самом деле я понял это на этот раз, но это ужасно. 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 нужно что-то вроде этого.