views:

767

answers:

1

Since I'm more comfortable using Eclipse, I thought I'd try converting my project from Visual Studio. Yesterday I tried a very simple little test. No matter what I try, make fails with "multiple target patterns". (This is similar to this unanswered question.)

I have three files:

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 have added the following paths to the compiler include path (-I):

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

I have added the following libraries to the linker (-l):

cv
cxcore
highgui

And the following library search path (-L):

"$(OPENCV)/lib/"

Eclipse, the compiler and the linker all succeed in including the headers and libraries. I am using the GNU C/C++ compiler & linker from Cygwin.

When compiling, I get the following make error:

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

Window.d contains:

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:

I tried removing all OpenCV headers from Window.d (from line 2 onwards), but the error remains. Also, I've updated Eclipse and OpenCV, all to no avail.

Do you have any ideas worth trying? I'm willing to try anything!

+3  A: 

Are you working from a Cygwin installation?

I've seen this problem before using Cygwin--basically, make sees the : in the path and thinks it is another target definition, hence the error.

If you are working from a Cygwin installation, you might try replacing the c:/ with /cygdrive/c/. If not, you might try using relative paths or using a network mount and see if that fixes it.

James McNellis
Yes, I'm running GCC from a Cygwin installation. Your answer is definitely pointing in the right direction. Coincidentally, I was just busy replacing `C:\` with `C\:/`, but then the compiler simply can't find the headers anymore. The same holds for replacing it with `/cygdrive/c/`. I'm fairly certain this will resolve the `make` problem, but how do I get them to work together?
Paul Lammertsma
I don't know how to prevent that Markdown from being escaped. Nevertheless, I had replaced "C:\" with "C\:/".
Paul Lammertsma
Just as a test, I copied all includes and libraries into my project path. Sure enough, it builds and runs. The problem seems to be specifying an absolute path.
Paul Lammertsma
When I had this problem before, we resolved it by simply replacing all of the `c:/` with `/cygdrive/c` (including in the environment variables it pulled in), and that solved our problem. I don't think you can use the `c:/` format path with GNU make (though there may be some Windows-specific build of it; I don't work with Cygwin enough to know). The network mount might still work--map `c:` as `c`, then you can access it from `\\mycomputer\c`. Other than that, I'm out of ideas :(.
James McNellis
One other idea: are you running `make` from a Cygwin shell? If not, the `/cygdrive` mappings won't be available.
James McNellis
maybe its possible to create enviroment variablse which point to your include directories, and use thos enviroment variables instead of the absolute path..
smerlin
No; `make` is invoked by Eclipse.
Paul Lammertsma
Try running Eclipse from the Cygwin shell.
James McNellis
Yes, it appears that that works. However, Eclipse runs so poorly that I think I will just use relative paths for the time being.
Paul Lammertsma