我一直在寻找这个问题,但除了我之外没有人似乎有这个,这就是我现在要问的原因。
如果有这个基本的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)
这很有效。它接受lib
和src
中的任何源文件,并将它很好地编译和链接在一起。 (通过使用在这些文件夹中找到的本地makefile,如果需要我也可以发布)
无论如何,我现在想要的是有条件地添加更多-D
指令。
我试过了:
ifdef ALLOW_BACKTRACE
CFLAGS += -DALLOW_BACKTRACE
LDFLAGS += -rdynamic
endif
还有:
ifdef ALLOW_BACKTRACE
CFLAGS := $(CFLAGS) -DALLOW_BACKTRACE
#endif
或者将整个内容放在引号等中......但每次我尝试时,都会显示make的帮助页面,告诉我它无法“识别”新的定义。 知道我做错了吗?
非常感谢任何帮助。
答案 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)
添加引号。一旦我这样做,它就像一个魅力...可能是因为它有空间问题。
感谢大家,他们试图帮助我。