Makefile 仅适用于 MSYS2 上的相对路径 (WIndows)
Makefile only working with relative paths on MSYS2 (WIndows)
我有一组程序可以在 Ubuntu 上正常编译,并且我正在开发一个也可以在 Windows 上编译的程序。我正在使用 MSYS2。
有一个主 Makefile,如下所示:
#### 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)
等等。在 src/
中有一些文件夹,每个文件夹都包含该项目的特定 Makefile。它们具有以下结构:
#### 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 $@
$(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 $@
$(DIR_BLD)/misc.o: $(DIR_SRC)/misc.cpp $(DIR_SRC)/misc.h
${COMP} -c misc.cpp ${COMPILE_FLAGS} -o $@
通过这种方式,特定的 Makefile 可以 运行 来自它们在 src/
中的文件夹,使用相对路径,或者来自主 Makefile,使用绝对路径。
这适用于 Ubuntu 但在 MSYS2 上只有相对路径有效,即 运行 从它们的文件夹中连接每个特定的 Makefile。当我 运行 主 Makefile 使用
mingw32-make.exe
我收到错误
$ 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
即使文件 /home/Jorgen/fqhe_mc_sphere/src/Misc/input.cpp
存在,我也可以使用 ls
检查。知道为什么吗?
编辑:
将第一个目标更改为除结果之外的相对路径,即
$(DIR_BLD)/input.o: input.cpp input.h misc_sphere.h
${COMP} -c input.cpp ${COMPILE_FLAGS} -o $@
输出对象文件出现类似错误:
Fatal error: can't create /home/Jorgen/fqhe_mc_sphere/build/Misc/input.o: No such file or directory
尽管文件夹 /home/Jorgen/fqhe_mc_sphere/build/Misc/
确实存在。
我尝试 运行以管理员身份使用 MSYS2,但没有帮助。
您将 POSIX 路径与 Windows 路径和 运行 mingw32-make 混合,后者不理解 POSIX 路径。
按照 user657267 的建议,改用 make。否则,您可以使用 mklink /D 玩弄技巧,在 Windows 上创建等同于 POSIX 的路径。在这里,您最有可能将 C:\home 链接到 C:\msys64\home。
我有一组程序可以在 Ubuntu 上正常编译,并且我正在开发一个也可以在 Windows 上编译的程序。我正在使用 MSYS2。
有一个主 Makefile,如下所示:
#### 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)
等等。在 src/
中有一些文件夹,每个文件夹都包含该项目的特定 Makefile。它们具有以下结构:
#### 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 $@
$(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 $@
$(DIR_BLD)/misc.o: $(DIR_SRC)/misc.cpp $(DIR_SRC)/misc.h
${COMP} -c misc.cpp ${COMPILE_FLAGS} -o $@
通过这种方式,特定的 Makefile 可以 运行 来自它们在 src/
中的文件夹,使用相对路径,或者来自主 Makefile,使用绝对路径。
这适用于 Ubuntu 但在 MSYS2 上只有相对路径有效,即 运行 从它们的文件夹中连接每个特定的 Makefile。当我 运行 主 Makefile 使用
mingw32-make.exe
我收到错误
$ 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
即使文件 /home/Jorgen/fqhe_mc_sphere/src/Misc/input.cpp
存在,我也可以使用 ls
检查。知道为什么吗?
编辑:
将第一个目标更改为除结果之外的相对路径,即
$(DIR_BLD)/input.o: input.cpp input.h misc_sphere.h
${COMP} -c input.cpp ${COMPILE_FLAGS} -o $@
输出对象文件出现类似错误:
Fatal error: can't create /home/Jorgen/fqhe_mc_sphere/build/Misc/input.o: No such file or directory
尽管文件夹 /home/Jorgen/fqhe_mc_sphere/build/Misc/
确实存在。
我尝试 运行以管理员身份使用 MSYS2,但没有帮助。
您将 POSIX 路径与 Windows 路径和 运行 mingw32-make 混合,后者不理解 POSIX 路径。
按照 user657267 的建议,改用 make。否则,您可以使用 mklink /D 玩弄技巧,在 Windows 上创建等同于 POSIX 的路径。在这里,您最有可能将 C:\home 链接到 C:\msys64\home。