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)
但是,当我运行此代码,无论是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:....
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上。
我认为 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”目标,使用信息而不是回显)
| 归档时间: |
|
| 查看次数: |
1035 次 |
| 最近记录: |