Un’applicazione molto semplice non funziona con “più pattern di destinazione” da Eclipse

Poiché mi sento più a mio agio nell’usare 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, fallire con “più modelli di destinazione”. (Questo è simile a questa domanda senza risposta .)

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  #include  #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 al percorso di inclusione del compilatore ( -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 riescono tutti a includere le intestazioni e le librerie. Sto usando il compilatore e linker GNU C / C ++ di Cygwin.

Durante la compilazione, ottengo il seguente errore di make :

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 (dalla linea 2 in poi), ma l’errore rimane. Inoltre, ho aggiornato Eclipse e OpenCV, tutto senza alcun risultato.

Hai qualche idea che valga la pena provare? Sono disposto a provare qualsiasi cosa!

Stai lavorando da un’installazione Cygwin?

Ho visto questo problema prima di usare Cygwin – fondamentalmente, 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, si potrebbe provare a sostituire 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.

secondo altre fonti internet questo è collegato a un problema che cygwin make ha con i nomi dei percorsi di Windows, specialmente il c :. Per me funziona bene con l’impostazione di percorsi relativi, invece.

per esempio se hai qualcosa come

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

aggiungete semplicemente ../mymodule/headers/ come include il percorso nella configurazione del progetto per il compilatore questo troverà l’intestazione afile.h e genererà make file con relativo percorso. (il comando del compilatore avrà l’istruzione -I../mymodule/headers/ )

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

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 bug sarà simile a questo:

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

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

Basta sostituire il file make nella cartella “C: \ cygwin \ bin \” (o ovunque sia installato cygwin) con il file di rendering “fisso” sopra menzionato.

Sembra che ci sia un modo semplice per risolvere questo. 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 usa makefile né GNU affatto. Eclipse gestisce il processo di compilazione stesso.

Se insisti a usare GNU make, questo non funziona

Ho anche riscontrato il problema di più pattern di target riportati 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 aggiungi 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.

È inoltre ansible eliminare i file * .d nelle cartelle di output e quindi compilare

 Debug/src/ 

Sto lavorando nell’ambiente Cygwin, su Windows 7 (64 bit), usando Eclipse Kepler CDT per C ++.

In Eclipse, goto

Progetto -> Proprietà -> C ++ Builder -> Impostazioni -> Scheda Impostazioni strumento

Cygwin C ++ Compiler -> Include

Nei percorsi Includi (-I) aggiungi 2 percorsi: “C: \ cygwin64 \ usr \ include \ libxml2”

e “/ cygdrive / c \ cygwin64 \ usr \ include \ libxml2”

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

L’errore “più modelli di destinazione. Stop”. si verificherà perché src / Window.d hanno i percorsi generati dal compilatore nella 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 importi questo progetto in Eclipse in una piattaforma Linux, ti consiglio di dare una build pulita in modo che la prossima generazione generi 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 è applicabile, se si utilizza cygwin. Il formato del percorso in cygwin è linux come formato /cygdrive/c/ invece di C:/