我有一个可以在Ubuntu上毫无问题地编译的项目。 https://github.com/avalon-lang/avaloni/blob/master/Makefile处的Makefile是我要适应Windows 10的文件。
我已安装MingW-w64和GNU Make-32。
当我对Makefile运行make时,未显示传递给编译器的CFLAGS和其他标志,在回显的输出中留有空格,而不是编译器标志。因此,找不到成功编译所需的文件。
我试图用其内容替换变量CFLAGS,SYSINC和INC,但没有任何变化。它们就像被make删除了一样被忽略。
cc := g++
cflags := -std=c++11 -g -Wall -pedantic -DDEBUG -fopenmp
ldpaths := -LC:/Boost/lib
rdpaths := -Wl,-rpath=C:/Boost/lib
ldflags := -lboost_filesystem-mgw81-mt-x64-1_68 -lboost_system-mgw81-mt-x64-1_68 -fopenmp
src_dir := src
inc := -Isrc -Ideps/qpp
sysinc := -isystem deps/boost -isystem deps/eigen
build_dir := build
bin_dir := bin
target := $(bin_dir)/avaloni.exe
src_ext := cpp
sources := $(shell dir $(src_dir)\*.$(src_ext) /b /s)
objects := $(patsubst $(src_dir)\%,$(build_dir)\%,$(sources:.$(src_ext)=.o))
install_dir := C:/Avalon
sdk_path := C:/Avalon/AvalonSdk
.PHONY: all
all: setup $(target)
$(target): $(objects)
$(cc) $^ -o $(target) $(ldpaths) $(ldflags) $(rdpaths)
$(build_dir)\%.o: $(src_dir)\%.$(src_ext)
@if not exist "$(dir $@)" mkdir $(dir $@)
$(cc) $(cflags) $(sysinc) $(inc) -c -o $@ $< #!!! This is the problem line.
在编译过程中,我期望一行如下所示:
g++ -std=c++11 -g -Wall -pedantic -DDEBUG -fopenmp -isystem deps/boost -isystem deps/eigen -Isrc -Ideps/qpp -c -o file.o file.cpp
但是我得到了
g++ -c -o file.o file.cpp
答案 0 :(得分:2)
其原因是(a)您使用非标准变量来保存编译器标志,并且(b)您的模式规则不匹配。
由于(b),make选择了用于创建目标文件的内置规则,并且由于(a),内置规则中没有使用任何标志。
您的模式规则不匹配的原因是GNU make不支持路径名中的反斜杠。您必须在所有规则中使用正斜杠:
$(build_dir)/%.o: $(src_dir)/%.$(src_ext)
...