Eclipse CDT не создает проект при изменении файла заголовка
У меня есть Eclipse Platform 3.7.2 и CDT 8.0.2.
Когда я хочу создавать заголовки "Build All" из других проектов рабочей области, не учитываются как зависимости, и ничего не перестраивается.
У меня есть приложение hello world и статический проект библиотеки.
Статическая библиотека устанавливается в качестве ссылки в свойствах проекта → c/С++ general → Paths и SYmbols → вкладка "Ссылки" → "Активно". Это единственная настройка, которую я изменил.
Кстати, он полностью бьет меня, почему Eclipse имеет дополнительный элемент "Project References" верхнего уровня в разделе "Свойства проекта".
Во всяком случае, я попробовал как внешний Builder (который по умолчанию выбирается при создании проекта), так и встроенный Builder, а также сочетания глобальной настройки "Preferences → С++ → Build → Build конфигурации только тогда, когда есть Изменения ресурса Eclipse........ '
Спасибо за любые мысли по этому поводу.
Обновление:
Это консольный вывод при построении зависимого проекта Proj2 (Proj1 - это lib).
вызывается "сделать все", но он просто переписывается, он не перекомпилирует Main.cpp так, как должен.
Кто-нибудь знакомый с создаваемыми затмением файлами make файлов? Еще раз спасибо.
**** Build of configuration Debug for project Proj2 ****
make all
Building target: Proj2
Invoking: Cross G++ Linker
g++ -L"/home/user/.eclipse-workspace/Proj1/Debug" -o "Proj2" ./Main.o -lProj1
Finished building target: Proj2
**** Build Finished ****
Изменить: это уже 1,5 года, хотелось добавить, что для этого была исправлена ошибка Eclipse:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=375800
Ответы
Ответ 1
существует ошибка для этой проблемы:
https://bugs.eclipse.org/bugs/show_bug.cgi?id=375800
И работающее и аккуратное обходное решение (об этом уже спрашивает запросчик orignal). Поэтому я просто перекрещиваюсь с фактическим ответом:) https://bugs.eclipse.org/bugs/show_bug.cgi?id=375800#c11
Все кредиты Кшиштофу Цяньскому
В настройках компилятора проекта c или С++ добавьте -MT ${OUTPUT_PREFIX}${OUTPUT}
после флагов:
${COMMAND} ${FLAGS} -MT ${OUTPUT_PREFIX}${OUTPUT} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}
Это создаст правильные .d файлы
Дополнение: Обходной путь имеет один побочный эффект. После того, как чистый make all
всегда будет работать дважды, прежде чем он ничего не скажет. Еще лучше, чем компиляция после изменения; -)
Ответ 2
Самая безопасная вещь - сначала "очистить" главный проект, а затем перестроить. Часто, когда я знаю, какие файлы в основном проекте используют измененные файлы заголовков, я просто "прикасаюсь" к этим файлам, а затем перестраиваю. "Touch" для меня просто добавляет пробел в строке, обычно одну из строк #include
в верхней части файла. Затем этот файл восстанавливает и подбирает измененный заголовок. Другие файлы, которые могут использовать этот заголовок, не будут восстановлены, поэтому это опасно. Например, если вы изменили подпись вызова метода и пересоздали этот способ, только один файл будет правильно вызывать новый метод. Вызов из других исходных файлов, скорее всего, приведет к ловушке вашей программы. Преимуществом является, конечно же, перестройка скорости. Особенно при выполнении модульного тестирования я точно знаю, какие тесты я буду запускать, поэтому я просто касаюсь соответствующих файлов, перестраиваю запуск. В какой-то момент для безопасности я всегда делаю цикл чистки/сборки. обычно я жду, пока мне не понадобится больше кофе.
Ответ 3
Просто выбросьте это, но не нужно ли вам включать заголовки из статической библиотеки в код клиента? В этом случае, я думаю, вам нужно будет добавить заголовки на вкладке includes
свойств проекта для вашего клиента. В противном случае я не уверен, как вы действительно получите доступ к реализации static lib в своем клиенте.
Что касается двух вкладок references
, я считаю, что один в C/С++ general может быть определен отдельно для разных конфигураций, в то время как более общий для любой конфигурации.
Update:
Я бы предложил использовать эту более общую вкладку reference
, которую вы заметили. Это должно гарантировать, что ваш клиент ссылается на другие проекты независимо от того, какая выбранная в данный момент конфигурация клиента или ссылается на проект.
Другое обновление:
Я просто понял, что вы упомянули, что единственная настройка, которую вы изменили, - это references
. Это еще один длинный снимок, но я также хотел бы проверить, действительно ли включенные пути для статической библиотеки отображаются на вкладке include параметров проектов (это, вероятно, есть). Я понимаю, что правильный путь включения используется во время компиляции, но eclipse (возможно) использует эту вкладку для определения зависимостей включения при принятии решения о перекомпиляции клиентского проекта. Возможно, стоит проверить вкладку "Расположение источника" и попытаться добавить местоположение заголовка в качестве исходного местоположения.
![enter image description here]()