Очень простое приложение терпит неудачу с «несколькими шаблонами целей» из Eclipse - PullRequest
10 голосов
/ 08 марта 2010

Поскольку мне удобнее пользоваться Eclipse, я решил попробовать конвертировать свой проект из Visual Studio. Вчера я попробовал очень простой маленький тест. Независимо от того, что я пытаюсь, make терпит неудачу с «несколькими целевыми шаблонами» (Это похоже на этот вопрос без ответа .)

У меня есть три файла:

Application.cpp:

using namespace std;

#include "Window.h"

int main() {
    Window *win = new Window();
    delete &win;
    return 0;
}

window.h:

#ifndef WINDOW_H_
#define WINDOW_H_

class Window {
public:
    Window();
    ~Window();
};

#endif

window.cpp:

#include <cv.h>
#include <highgui.h>

#include "Window.h"

const char* WINDOW_NAME = "MyApp";

Window::Window() {
    cvNamedWindow(WINDOW_NAME, CV_WINDOW_AUTOSIZE);
    cvResizeWindow(WINDOW_NAME, 200, 200);
    cvMoveWindow(WINDOW_NAME, 0, 0);
    int key = 0;
    while (true) {
        key = cvWaitKey(0);
        if (key==27 || cvGetWindowHandle(WINDOW_NAME)==0) {
            break;
        }
    }
}
Window::~Window() {
    cvDestroyWindow(WINDOW_NAME);
}

Я добавил следующие пути к пути включения компилятора (-I):

"$(OPENCV)/cv/include"
"$(OPENCV)/cxcore/include"
"$(OPENCV)/otherlibs/highgui"

Я добавил следующие библиотеки в компоновщик (-l):

cv
cxcore
highgui

И следующий путь поиска библиотеки (-L):

"$(OPENCV)/lib/"

Eclipse, компилятор и компоновщик преуспевают, включая заголовки и библиотеки. Я использую компилятор и компоновщик GNU C / C ++ от Cygwin.

При компиляции я получаю следующую ошибку make:

src/Window.d:1: *** multiple target patterns. Stop.

Window.d содержит:

src/Window.d src/Window.o: ../src/Window.cpp \
  C:/Program\ Files/OpenCV/cv/include/cv.h \
  C:/Program\ Files/OpenCV/cxcore/include/cxcore.h \
  C:/Program\ Files/OpenCV/cxcore/include/cxtypes.h \
  C:/Program\ Files/OpenCV/cxcore/include/cxerror.h \
  C:/Program\ Files/OpenCV/cxcore/include/cvver.h \
  C:/Program\ Files/OpenCV/cxcore/include/cxcore.hpp \
  C:/Program\ Files/OpenCV/cv/include/cvtypes.h \
  C:/Program\ Files/OpenCV/cv/include/cv.hpp \
  C:/Program\ Files/OpenCV/cv/include/cvcompat.h \
  C:/Program\ Files/OpenCV/otherlibs/highgui/highgui.h \
  C:/Program\ Files/OpenCV/cxcore/include/cxcore.h ../src/Constants.h \
  ../src/Window.h
C:/Program\ Files/OpenCV/cv/include/cv.h:
C:/Program\ Files/OpenCV/cxcore/include/cxcore.h:
C:/Program\ Files/OpenCV/cxcore/include/cxtypes.h:
C:/Program\ Files/OpenCV/cxcore/include/cxerror.h:
C:/Program\ Files/OpenCV/cxcore/include/cvver.h:
C:/Program\ Files/OpenCV/cxcore/include/cxcore.hpp:
C:/Program\ Files/OpenCV/cv/include/cvtypes.h:
C:/Program\ Files/OpenCV/cv/include/cv.hpp:
C:/Program\ Files/OpenCV/cv/include/cvcompat.h:
C:/Program\ Files/OpenCV/otherlibs/highgui/highgui.h:
C:/Program\ Files/OpenCV/cxcore/include/cxcore.h:
../src/Window.h:

Я попытался удалить все заголовки OpenCV из Window.d (начиная со строки 2 и далее), но ошибка остается. Кроме того, я обновил Eclipse и OpenCV, но все безрезультатно.

У вас есть идеи, которые стоит попробовать? Я готов попробовать что угодно!

Ответы [ 9 ]

26 голосов
/ 08 марта 2010

Вы работаете с установкой Cygwin?

Я видел эту проблему перед использованием Cygwin - в основном, make видит : в пути и думает, что это другое определение цели, отсюда и ошибка.

Если вы работаете с установкой Cygwin, вы можете попробовать заменить c:/ на /cygdrive/c/. Если нет, вы можете попробовать использовать относительные пути или использовать сетевое монтирование и посмотреть, исправляет ли это.

6 голосов
/ 07 декабря 2011

согласно другим интернет-источникам это связано с проблемой, которую cygwin make имеет с именами путей windows, особенно c :.Для меня это нормально работает с настройкой относительных путей вместо этого.

например, если у вас есть что-то вроде

proj/mymodule/headers/afile.h
proj/mymodule/source/abc/afile.c

, просто добавьте ../mymodule/headers/ в качестве пути включения в конфигурации проекта для компилятора, который это найдетзаголовок afile.h и создаст файлы make с относительным путем.(команда компилятора будет иметь оператор -I../mymodule/headers/)

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

4 голосов
/ 14 июня 2011

В Cygwin, GNU make version 3.81-1, поставляемая программой установки по умолчанию, не работает с автоматическими зависимостями файла заголовка, сгенерированными компиляторами. Сообщение об ошибке, которое вы увидите из-за этой ошибки, будет выглядеть примерно так:

Вот два предложенных исправления: - Попробуйте получить предыдущую версию (3.80) - Получить исправленную версию 3.81, например, от http://www.cmake.org/files/cygwin/make.exe

src: https://projects.coin -or.org / BuildTools / wiki / current-Issues

Просто замените файл make в папке «C: \ cygwin \ bin \» (или там, где установлен cygwin) на «исправленный» файл make, упомянутый выше.

1 голос
/ 27 июня 2013

У меня также была проблема с несколькими шаблонами целей, сообщаемыми make при использовании eclipse в windows / cygwin. Я решил проблему, как предложено выше, используя только относительные пути. Я не осознавал, что у меня есть абсолютные пути, но когда я указал каталог включения с помощью каталога проекта, eclipse расширил его до полного пути.

Например, если вы добавите путь относительно рабочей области, eclipse сгенерирует "" $ {workspace_loc: / include} "", который расширится до чего-то, начинающегося с "c: \". Вот почему это происходило в моем случае.

Я просто заменил сложную строку выше на "../../include", и это решило мою проблему.

1 голос
/ 17 декабря 2012

Похоже, есть простой способ решить эту проблему. Просто измените «Текущий построитель» с «GNU Make Builder» на «Внутренний построитель CDT» в Свойствах проекта-> C / C ++ Builder-> Редактор цепочек инструментов-> Текущий построитель.

Для меня эта проблема вызвана автоматически генерируемыми файлами зависимостей "XXX.d" в каталоге Debug (или release :), которые были сгенерированы gcc -MF как побочный эффект для gcc -c. Но GNU make явно забыл добавить кавычки вокруг имен файлов, когда -MF.

"CDT Internal Builder" вообще не использует makefile и GNU make. Eclipse управляет самим процессом сборки.

Если вы настаиваете на использовании GNU make, это не сработает

0 голосов
/ 27 февраля 2018

Ошибка «несколько целевых паттернов. Стоп». произойдет, потому что src / Window.d имеет пути, сгенерированные компилятором в платформе Windows как:

C:/Program\ Files/OpenCV/cv/include/cv.h \ C:/Program\ Files/OpenCV/cxcore/include/cxcore.h \ C:/Program\ Files/OpenCV/cxcore/include/cxtypes.h \ C:/Program\ Files/OpenCV/cxcore/include/cxerror.h \

Если вы импортируете этот проект в Eclipse на платформе Linux, я бы порекомендовал вам дать чистую сборку, чтобы следующая сборка генерировала путь в формате Linux как:

/home/user/OpenCV/cv/include/cv.h \ /home/user/OpenCV/cxcore/include/cxcore.h \ /home/user/OpenCV/cxcore/include/cxtypes.h \ /home/user/OpenCV/cxcore/include/cxerror.h \

То же самое применимо, если вы используете Cygwin. Формат пути в cygwin - это формат linux /cygdrive/c/ вместо C:/

0 голосов
/ 16 ноября 2015

Одним из изменений, которое мне помогло (я использую терминал Cygwin и SSH в сервер SVN параллельно), было удаление файлов .d. Когда я позвонил make -f makefile из Cygwin, он что-то сломал. Я обычно компилирую из терминала Putty, и после удаления файлов .d из моего проекта он перестал жаловаться на множественные цели.

0 голосов
/ 22 октября 2014

Я работаю в среде Cygwin, в Windows 7 (64-разрядная версия), использую Eclipse Kepler CDT для C ++.

В Eclipse, перейти к

Проект -> Свойства -> C ++ Builder -> Настройки -> Настройки инструмента Вкладка

Компилятор Cygwin C ++ -> Включает

В поле Включить пути (-I) добавьте 2 пути: "C: \ cygwin64 \ usr \ include \ libxml2"

и "/ cygdrive / c \ cygwin64 \ usr \ include \ libxml2"

0 голосов
/ 27 сентября 2013

Вы также можете удалить * .d файлы из папок вывода и затем создать

Debug/src/
...