Make忽略编译器标志

时间:2018-12-21 22:29:42

标签: windows g++ gnu-make

我有一个可以在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

1 个答案:

答案 0 :(得分:2)

其原因是(a)您使用非标准变量来保存编译器标志,并且(b)您的模式规则不匹配。

由于(b),make选择了用于创建目标文件的内置规则,并且由于(a),内置规则中没有使用任何标志。

您的模式规则不匹配的原因是GNU make不支持路径名中的反斜杠。您必须在所有规则中使用正斜杠:

$(build_dir)/%.o: $(src_dir)/%.$(src_ext)
  ...