Very simple application fails with "multiple target patterns" from Eclipse

35,355

Solution 1

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.

Solution 2

according to other internet sources this is related to a problem that cygwin make has with windows path names, specially the c:. For me it workes fine with setting relative paths instead.

e.g. if you have something like

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

just add ../mymodule/headers/ as include path in the project configuration for the compiler this will find the header afile.h and will generate make files with relative path. (compiler command will have the statement -I../mymodule/headers/ )

looks like execution directory is always the project base directory.

Solution 3

On Cygwin, GNU make version 3.81-1 delivered by the default setup program doesn't work with the automatic header file dependencies, generated by the compilers. The error message you will see because of this bug will look something like this:

Here are two suggested fixes: - Try to obtain the previous version (3.80) - Obtain a fixed 3.81 version, for example from http://www.cmake.org/files/cygwin/make.exe

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

Simply replace the make file in your "C:\cygwin\bin\" folder (or wherever cygwin is installed) with the "fixed" make file mentioned above.

Solution 4

Looks like there is a simple way to solve this. Just change the "Current Builder" from "GNU Make Builder" to "CDT Internal Builder" in Project properties->C/C++ Builder->Tool Chain Editor->Current Builder will do.

To me, this problem is caused by the automatically generated "XXX.d" dependency files in Debug directory (or release :), which were generated by gcc -MF as a side-effect to gcc -c. But GNU make obviously forgot to add quotations around file names when -MF.

"CDT Internal Builder" does not use makefile nor GNU make at all. Eclipse manage the build process itself.

If you insist to use GNU make, this doesn't work

Solution 5

I also had the problem of multiple target patterns reported by make when using eclipse on windows/cygwin. I solved the problem as suggested above by using only relative paths. I didn't realize that I had absolute paths, but when I specified an include directory using the project directory, eclipse expanded it into the full path.

For instance, if you add a path relative to the workspace, eclipse generates ""${workspace_loc:/include}"" which will expand to something starting with "c:\". This is why it was happening in my case.

I simply replaced the complex string above with "../../include" and it solved my problem.

Share:
35,355
Bahadır Yıldırım
Author by

Bahadır Yıldırım

Senior Developer Relations Engineer for Android, Wear OS and Android TV. Co-founder and former CTO of Pixplicity. I occasionally speak at Android conferences and am an advocate of open software. I did both my bachelor and master at Utrecht University's Institute of Information and Computing Sciences.

Updated on July 05, 2022

Comments

  • Bahadır Yıldırım
    Bahadır Yıldırım almost 2 years

    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!

  • Bahadır Yıldırım
    Bahadır Yıldırım about 14 years
    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?
  • Bahadır Yıldırım
    Bahadır Yıldırım about 14 years
    I don't know how to prevent that Markdown from being escaped. Nevertheless, I had replaced "C:\" with "C\:/".
  • Bahadır Yıldırım
    Bahadır Yıldırım about 14 years
    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.
  • James McNellis
    James McNellis about 14 years
    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
    James McNellis about 14 years
    One other idea: are you running make from a Cygwin shell? If not, the /cygdrive mappings won't be available.
  • smerlin
    smerlin about 14 years
    maybe its possible to create enviroment variablse which point to your include directories, and use thos enviroment variables instead of the absolute path..
  • Bahadır Yıldırım
    Bahadır Yıldırım about 14 years
    No; make is invoked by Eclipse.
  • James McNellis
    James McNellis about 14 years
    Try running Eclipse from the Cygwin shell.
  • Bahadır Yıldırım
    Bahadır Yıldırım about 14 years
    Yes, it appears that that works. However, Eclipse runs so poorly that I think I will just use relative paths for the time being.