【问题标题】:Update CFLAGS or LDFLAGS in makefile depending on current OS根据当前操作系统更新 makefile 中的 CFLAGS 或 LDFLAGS
【发布时间】:2016-03-15 10:20:18
【问题描述】:

我正在尝试创建一个适用于 OSX 和 Linux 的 makefile。

我的问题是我需要更改 cflagsldflags,具体取决于执行 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)

但是当我运行这段代码时,cflagsldflagsCC 都不会在 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。

【问题讨论】:

    标签: c++ macos makefile


    【解决方案1】:

    我认为 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)
    
    ...
    

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

    【讨论】:

    • info 出现 makefile: commands commence before first target. 错误,但如果我删除它,它似乎工作得很好,并且解决了引号问题。
    • 嗯,这可能是 MacOs make 中的一些不兼容,因为 info 命令通常在 GNU make 中工作。或者,如果 $(info 前面有一个制表符而不是空格,这也可能是问题所在(制表符有时在 makefile 中有点特殊)。您也可以尝试将 info 语句放在 ifeq 之外(在块)之前没有任何空格/制表符。
    猜你喜欢
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2014-06-25
    • 2014-12-11
    • 1970-01-01
    • 2023-03-27
    • 2018-08-25
    相关资源
    最近更新 更多