我正在尝试创建一个适用于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。
答案 0 :(得分:3)
我认为ifeq块不应该进入make目标,而应该进入makefile的前面(在all之前)。
即。像这样:
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)
...
(没有“DetectOS”目标,使用信息而不是回声)