我正在尝试创建一个适用于OSX和Linux的makefile。
我的问题是,我需要根据执行makefile的操作系统更改 cflags 和 ldflags ,但我无法使其起作用。以下是我的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)
然而,当我运行这段代码时,在 ifeq
条件块中,cflags
、ldflags
和 CC
都没有更新。我得到了以下结果:
$ 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:....
如您所见,操作系统已被检测到,因为我们进入了ifeq
条件块,但是CC
没有更新,并保留了一个未初始化的值cc
。最后,链接器过程失败,因为OpenCL未在ldflags
中引用。
另外一个小问题是,如果我在LDFLAGS="-lm -framework OpenCL"
中不加引号,则会出现错误:
LDFLAGS=-lm -framework OpenCL
/bin/sh: -framework: command not found
make: *** [DetectOS] Error 127
根据多个例子(例如stackoverflow上的例子),我应该不使用引号进行操作。
我目前使用的是Mac OS X Yosemite系统。
info
,我遇到了makefile: commands commence before first target.
错误,但是如果我删除它,它似乎可以正常工作,并且解决了引号问题。 - Kantium