Make将不接受附加的CFLAGS值

时间:2013-08-07 08:28:47

标签: makefile

我一直在寻找这个问题,但除了我之外没有人似乎有这个,这就是我现在要问的原因。

如果有这个基本的makefile:

CCPP = arm-none-linux-gnueabi-g++
CFLAGS = "-WALL -DPLATFORM_TARGET -DPRINT_MESSAGE"
LIB = lib/libarm.a

LDFLAGS = -lpthread
OBJECTS = $(wildcard ./*/*.o)
PROG = /exports/appl

MODULES = lib src

all: $(PROG) 
    $(CCPP) $(LDFLAGS) $(OBJECTS) $(LIB) -o $(PROG)

$(PROG): $(MODULES)
    @for i in $(MODULES); do (cd $$i && $(MAKE) \
    CCPP=$(CCPP) LDPP=$(CCPP) CFLAGS=$(CFLAGS) LDFLAGS=$(LDFLAGS)) || exit 1 ;\
    done

clean:
    @for i in $(MODULES); do (cd $$i && $(MAKE) clean) || exit 1 ; done
    rm $(PROG)

lib:
    ar cr ../lib/$(LIB) $(OBJECTS)

这很有效。它接受libsrc中的任何源文件,并将它很好地编译和链接在一起。 (通过使用在这些文件夹中找到的本地makefile,如果需要我也可以发布)

无论如何,我现在想要的是有条件地添加更多-D指令。 我试过了:

ifdef ALLOW_BACKTRACE
    CFLAGS += -DALLOW_BACKTRACE
    LDFLAGS += -rdynamic
endif

还有:

ifdef ALLOW_BACKTRACE
    CFLAGS := $(CFLAGS) -DALLOW_BACKTRACE
#endif

或者将整个内容放在引号等中......但每次我尝试时,都会显示make的帮助页面,告诉我它无法“识别”新的定义。 知道我做错了吗?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

好的,这应该是你的makefile的更正确的版本,我无法测试它,因为我没有你的来源:

export CCPP := arm-none-linux-gnueabi-g++

# Note that -pthread is required for both compiling and linking.
export CFLAGS := -pthread -WALL -DPLATFORM_TARGET -DPRINT_MESSAGE
export LDFLAGS := -pthread

LIB := lib/libarm.a
PROG := /exports/appl
MODULES := lib src

all: $(PROG)

$(PROG): $(MODULES)
    $(CCPP) -o $@ $(LDFLAGS) ./*/*.o $(LIB)

$(MODULES) : % :
    $(MAKE) -C $@
    touch $@

clean-module.%:
    $(MAKE) -C $* clean

clean : $(MODULE:%=clean-module.%)
    rm -f $(PROG)

.PHONY: all clean clean-module.%

我改变了什么:

  • LDFLAGS = -lpthread:在构建多线程应用程序时,您需要额外的编译器和链接器标志,这是-pthread/-pthreads gcc选项。
  • OBJECTS = $(wildcard ./*/*.o)的内容仅在$(MODULES)正确构建时才正确。删除了它。
  • $(PROG)命令实际上构建了$(PROG)目标。
  • $(MODULES)命令通过在相应目录中调用make来构建模块。然后他们更新目录的时间戳以强制重建$(PROG)。由于它是一个递归的make,它无法知道模块中是否有任何实际更新,因此它需要触发重建依赖于模块的任何东西。

我仍然觉得这对你不起作用,因为你的原始makefile缺少依赖。

答案 1 :(得分:0)

尝试这样做 - >

ifeq ($(ALLOW_BACKTRACE),1) 
  CFLAGS += -DALLOW_BACKTRACE 
 endif

答案 2 :(得分:0)

你必须要跟我打招呼!

咳咳。我似乎找到了解决自己问题的方法。我不太明白,但不管有什么用,对吗?

无论如何,这就是我的所作所为:

CFLAGS  += -Wall -DPLATFORM_TARGET -DPRINT_MESSAGE
ifdef ALLOW_BACKTRACE
    CFLAGS += -DALLOW_BACKTRACE
    LDFLAGS += -rdynamic
endif

LDFLAGS += -lpthread

$(PROG): $(MODULES)
    @for i in $(MODULES); do (cd $$i && $(MAKE) \
        CCPP=$(CCPP) LDPP=$(CCPP) CFLAGS="$(CFLAGS)" LDFLAGS=$(LDFLAGS)) || exit 1 ;\
    done

第一件事:-rdynamic需要是链接器中的第一个标志,否则它拒绝工作。 (不要问我为什么,如果有人能够启发我,请成为我的客人。

第二:我必须在实际构建步骤中围绕展开的$(CFLAGS)添加引号。一旦我这样做,它就像一个魅力...可能是因为它有空间问题。

感谢大家,他们试图帮助我。