2016-05-17 10 views
1

Ich habe eine Reihe von Programmen, die unter Ubuntu gut kompilieren und ich arbeite an einem Setup, um auch auf Windows zu kompilieren. Ich benutze MSYS2.Makefile funktioniert nur mit relativen Pfaden auf MSYS2 (Windows)

Es gibt ein Hauptmakefile, die wie folgt aussieht:

#### Project main directory 

DIR_MAIN=$(shell pwd) 

#### Compile all 

all: 
    @$(MAKE) -C src/Misc DIR_MAIN=$(DIR_MAIN) 
    @$(MAKE) -C src/CF_states DIR_MAIN=$(DIR_MAIN) 

etcetera. In src/ gibt es Ordner, die jeweils ein bestimmtes Makefile für dieses Projekt enthalten. Sie haben die folgende Struktur:

#### Directories and flags 

ifndef $(DIR_MAIN) 
    DIR_MAIN=../.. 
endif 

DIR_EXE=$(DIR_MAIN)/Programs 
DIR_SRC=$(DIR_MAIN)/src/Misc 
DIR_SFMT_SRC=$(DIR_MAIN)/src/sfmt 
DIR_BLD=$(DIR_MAIN)/build/Misc 
COMP=g++ 

COMPILE_FLAGS= -std=c++11 -O3 -lstdc++ -msse2 
LINK_FLAGS= -O3 -fopenmp -lgsl -lgslcblas -lm -lhdf5_cpp -lhdf5 


#### Compile all 

all: setup $(DIR_BLD)/input.o $(DIR_BLD)/misc_sphere.o $(DIR_BLD)/misc.o 

setup: 
    @mkdir -p $(DIR_BLD) 
    @mkdir -p $(DIR_EXE) 

#### Misc source 

$(DIR_BLD)/input.o: $(DIR_SRC)/input.cpp $(DIR_SRC)/input.h $(DIR_SRC)/misc_sphere.h 
    ${COMP} -c input.cpp ${COMPILE_FLAGS} -o [email protected] 

$(DIR_BLD)/misc_sphere.o: $(DIR_SRC)/misc_sphere.cpp $(DIR_SRC)/misc_sphere.h $(DIR_SRC)/misc.h 
    ${COMP} -c misc_sphere.cpp ${COMPILE_FLAGS} -o [email protected] 

$(DIR_BLD)/misc.o: $(DIR_SRC)/misc.cpp $(DIR_SRC)/misc.h 
    ${COMP} -c misc.cpp ${COMPILE_FLAGS} -o [email protected] 

Auf diese Weise der spezifischen Makefiles aus ihrem Ordner in src/ ausgeführt werden, unter Verwendung von relativen Pfaden oder von der Hauptmakefile, mit absoluten Pfaden.

Dies funktioniert auf Ubuntu, aber auf MSYS2 funktionieren nur die relativen Pfade, d. H. Das Ausführen jedes der spezifischen Makefiles aus ihren Ordnern. Als ich die Hauptmakefile laufen mit

mingw32-make.exe 

Ich erhalte den Fehler

$ mingw32-make.exe 
mingw32-make[1]: Entering directory 'C:/msys64/home/Jorgen/fqhe_mc_sphere/src/Misc' 
mingw32-make[1]: *** No rule to make target '/home/Jorgen/fqhe_mc_sphere/src/Misc/input.cpp', needed by '/home/Jorgen/fqhe_mc_sphere/build/Misc/input.o'. Stop. 
mingw32-make[1]: Leaving directory 'C:/msys64/home/Jorgen/fqhe_mc_sphere/src/Misc' 
Makefile:8: recipe for target 'all' failed 
mingw32-make: *** [all] Error 2 

, obwohl die Datei /home/Jorgen/fqhe_mc_sphere/src/Misc/input.cpp gibt es, wie ich ls mit überprüfen können. Irgendeine Idee warum?

EDIT:

das erste Ziel in relative Pfade mit Ausnahme des Ergebnis ändern, dh

$(DIR_BLD)/input.o: input.cpp input.h misc_sphere.h 
    ${COMP} -c input.cpp ${COMPILE_FLAGS} -o [email protected] 

I einen ähnlichen Fehler für die Ausgangsobjektdatei erhalten:

Fatal error: can't create /home/Jorgen/fqhe_mc_sphere/build/Misc/input.o: No such file or directory 

Obwohl die Ordner /home/Jorgen/fqhe_mc_sphere/build/Misc/ existiert nicht.

Ich habe versucht, MSYS2 als Administrator ausgeführt, die nicht geholfen hat.

+4

Versuchen Sie 'make' unter MSYS2 auszuführen, nicht' mingw32-make'. – user657267

Antwort

4

Sie mischen POSIX-Pfade mit Windows-Pfaden und führen mingw32-make aus, das POSIX-Pfade nicht versteht.

Wie Benutzer657267 empfiehlt, stattdessen make verwenden. Andernfalls können Sie mit mklink/D Tricks spielen, um Pfade unter Windows zu erstellen, die den POSIX-Pfaden entsprechen. Hier sollten Sie C: \ home am ehesten mit C: \ msys64 \ home verknüpfen.

Verwandte Themen