2010-03-08 6 views
9

Poiché sono più a mio agio nell'utilizzare Eclipse, ho pensato di provare a convertire il mio progetto da Visual Studio. Ieri ho provato un piccolo test molto semplice. Non importa quello che provo, make non riesce con "più modelli di destinazione". (Questo è simile a this unanswered question.)L'applicazione molto semplice non funziona con "più modelli di destinazione" da Eclipse

Ho tre file:

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); 
} 

Ho aggiunto i seguenti percorsi del compilatore includono percorso (-I):

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

ho aggiunto le seguenti librerie al linker (-l):

cv 
cxcore 
highgui 

E il seguente percorso di ricerca della libreria (-L):

"$(OPENCV)/lib/" 

Eclipse, il compilatore e il linker tutti riescono a comprese le intestazioni e le librerie. Sto usando il compilatore GNU C/C++ & da Cygwin.

Quando si compila, ottengo il seguente make errore:

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

Window.d contiene:

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: 

Ho provato a rimuovere tutte le intestazioni OpenCV da Window.d (da linea 2 in poi), ma l'errore rimane. Inoltre, ho aggiornato Eclipse e OpenCV, tutto senza alcun risultato.

Avete qualche idea da provare? Sono disposto a provare qualsiasi cosa!

+0

Probabilmente è stato incluso il makefile. Poiché si tratta di un errore di 'make', probabilmente è più importante del codice sorgente C++. – skyking

risposta

23

Stai lavorando da un'installazione Cygwin?

Ho visto questo problema prima di utilizzare Cygwin - in pratica, make vede il : nel percorso e pensa che sia un'altra definizione di destinazione, quindi l'errore.

Se si sta lavorando da un'installazione Cygwin, è possibile provare a sostituire lo c:/ con /cygdrive/c/. In caso contrario, potresti provare a utilizzare percorsi relativi o utilizzare un mount di rete e vedere se questo lo risolve.

+0

Sì, eseguo GCC da un'installazione Cygwin. La tua risposta punta decisamente nella giusta direzione. Per coincidenza, ero solo occupato a sostituire 'C: \' con 'C \: /', ma poi il compilatore semplicemente non riesce più a trovare le intestazioni. Lo stesso vale per la sua sostituzione con '/ cygdrive/c /'. Sono abbastanza certo che questo risolverà il problema del 'make', ma come faccio a farli lavorare insieme? –

+0

Non so come impedire a Markdown di essere scappato. Tuttavia, avevo sostituito "C: \" con "C \: /". –

+1

Proprio come un test, ho copiato tutti gli include e le librerie nel mio percorso di progetto. Abbastanza sicuro, costruisce e corre. Il problema sembra indicare un percorso assoluto. –

4

Su Cygwin, GNU rende la versione 3.81-1 fornita dal programma di installazione predefinito non funziona con le dipendenze dei file di intestazione automatica, generate dai compilatori. Il messaggio di errore che vedrai a causa di questo errore sarà simile a questo:

Ecco due soluzioni suggerite: - Prova ad ottenere la versione precedente (3.80) - Ottenere una versione fissa 3.81, per esempio da http://www.cmake.org/files/cygwin/make.exe

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

sostituire semplicemente il file fare nella vostra "C: \ cygwin \ bin \" cartella (o ovunque sia installato Cygwin) con il file "fisso" creato sopra.

6

in base ad altre fonti internet questo è correlato a un problema che cygwin make ha con i nomi dei percorsi di Windows, in particolare il c :. Per me funziona bene con l'impostazione dei percorsi relativi.

ad es. se avete qualcosa di simile

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

basta aggiungere ../mymodule/headers/ come percorso di inclusione nella configurazione del progetto per il compilatore questo troverà l'intestazione afile.h e genererà rendere i file con il percorso relativo. (il comando del compilatore avrà la dichiarazione -I../mymodule/headers/)

sembra che la directory di esecuzione sia sempre la directory di base del progetto.

1

Sembra che ci sia un modo semplice per risolvere questo problema. Basta cambiare "Current Builder" da "GNU Make Builder" a "CDT Internal Builder" nelle proprietà del progetto-> C/C++ Builder-> Tool Chain Editor-> Current Builder farà.

Per me, questo problema è causato dai file di dipendenza "XXX.d" generati automaticamente nella directory Debug (o release :), che sono stati generati da gcc -MF come un effetto collaterale di gcc -c. Ma GNU fa ovviamente dimenticato di aggiungere quotazioni intorno ai nomi di file quando -MF.

"CDT Internal Builder" non utilizza makefile né GNU affatto. Eclipse gestisce il processo di compilazione stesso.

Se si insiste per usare GNU make, questo non funziona

1

Ho anche avuto il problema di molteplici modelli di target riportate da make quando si utilizza Eclipse su Windows/Cygwin. Ho risolto il problema come suggerito sopra usando solo percorsi relativi. Non avevo capito che avevo percorsi assoluti, ma quando ho specificato una directory include usando la directory del progetto, eclipse lo ha espanso nel percorso completo.

Ad esempio, se si aggiunge un percorso relativo all'area di lavoro, eclipse genera "" $ {workspace_loc:/include} "" che si espanderà a qualcosa che inizia con "c: \". Questo è il motivo per cui stava accadendo nel mio caso.

Ho semplicemente sostituito la stringa complessa di cui sopra con "../../include" e ha risolto il mio problema.

+0

nice, che ha funzionato per me –

0

È possibile anche cancellare i file * .d sotto cartelle di output e poi costruire

Debug/src/ 
0

sto lavorando in ambiente Cygwin, su Windows 7 (64 bit), con Eclipse CDT Keplero per C++.

In Eclipse, goto

Project --> Properties --> C++ Builder --> Settings --> Tool Settings Tab

Cygwin C++ Compiler --> Includes

Nei percorsi comprendono (-I) Aggiungere 2 percorsi: "C: \ cygwin64 \ usr \ include \ libxml2"

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

0

Una modifica che ha funzionato per me (utilizzo il terminale Cygwin e SSH in un server SVN in parallelo) consisteva nell'eliminare i file .d. Quando ho chiamato lo make -f makefile da Cygwin, ha rotto qualcosa. Di solito compilo dal terminale Putty e, dopo aver eliminato i file .d dal mio progetto, ha smesso di lamentarsi dei bersagli multipli.

0

Errore "Motivi di destinazione multipli. si verificherà perché src/Window.d ha i percorsi generati dal compilatore in piattaforma Windows come:

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 \

Se si importa questo progetto in Eclipse nella piattaforma Linux, io mi consiglia di dare una generazione pulita in modo che prossima generazione genera il percorso in formato Linux come:

/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 \

lo stesso vale, se si sta utilizzando cygwin. Il formato del percorso in cygwin è il formato di linux /cygdrive/c/ invece di C:/

Problemi correlati