根据当前操作系统更新makefile中的CFLAGS或LDFLAGS

Kan*_*ium 5 c++ macos makefile

我正在尝试创建一个在OSX和Linux上均可使用的makefile。

我的问题是我需要更改,cflags并且ldflags取决于操作系统,makefile已执行,但无法使其正常工作。那是我的makefile:

OS:=$(shell uname)
DST=hello
SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)
CFLAGS=

all: clean DetectOS $(DST)

DetectOS:
ifeq ($(OS),Darwin)
    @echo OS : $(OS)
    CC=g++
    LDFLAGS="-lm -framework OpenCL"
    CFLAGS+=-O3
endif

ifeq ($(OS),Linux)
    #Coming soon...
endif

$(DST): $(OBJ)
    $(CC) -o $@ $^ $(LDFLAGS)

%.o: %.cpp
    $(CC) -o $@ -c $< $(CFLAGS)

clean:
    rm -rf *.o $(DST)
Run Code Online (Sandbox Code Playgroud)

但是,当我运行此代码,无论是cflagsldflags还是CC在更新的ifeq条件块。我得到以下结果:

$ make
rm -rf *.o hello
OS : Darwin
CC=g++
LDFLAGS="-lm -framework OpenCL"
CFLAGS+=-O3
cc -o opencl.o -c opencl.cpp 
cc -o hello opencl.o 
Undefined symbols for architecture x86_64:....
Run Code Online (Sandbox Code Playgroud)

如您所见,检测到该操作系统是因为我们进入了ifeq条件块,但未CC更新,并保留了未初始化的值cc。最后,链接器过程失败,因为未在中引用OpenCL ldflags

还有一点,如果我不加引号,则会LDFLAGS="-lm -framework OpenCL"出现错误:

LDFLAGS=-lm -framework OpenCL
/bin/sh: -framework: command not found
make: *** [DetectOS] Error 127
Run Code Online (Sandbox Code Playgroud)

基于多个示例(此处基于stackoverflow),我应该不加引号。

我目前在Mac OS X Yosemite上。

axa*_*lis 4

我认为 ifeq 块不应该进入 make 目标,而应该进入 makefile 的前面(在所有之前:)。

即像这样:

OS:=$(shell uname)
DST=hello
SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)
CFLAGS=

ifeq ($(OS),Darwin)
    $(info OS is $(OS))
    CC=g++
    LDFLAGS=-lm -framework OpenCL
    CFLAGS+=-O3
endif

ifeq ($(OS),Linux)
    #Coming soon...
endif

all: clean $(DST)

...
Run Code Online (Sandbox Code Playgroud)

(没有“DetectOS”目标,使用信息而不是回显)