【发布时间】:2016-03-15 10:20:18
【问题描述】:
我正在尝试创建一个适用于 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)
但是当我运行这段代码时,cflags、ldflags 或 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:....
如您所见,检测到操作系统是因为我们进入了ifeq 条件块,但CC 没有更新并保持cc 的未初始化值。最后,链接器进程失败,因为 ldflags 中没有引用 OpenCL。
另外一点,如果我不在LDFLAGS="-lm -framework OpenCL" 中加上引号,我会收到错误消息:
LDFLAGS=-lm -framework OpenCL
/bin/sh: -framework: command not found
make: *** [DetectOS] Error 127
并且基于多个示例(在 stackoverflow 上),我应该不带引号。
我目前使用的是 Mac OS X Yosemite。
【问题讨论】: