0

我已经四处寻找这个问题,但似乎除了我之外没有人拥有它,这就是我现在要问的原因。

如果有这个基本的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 的帮助页面,告诉我它无法“识别”新定义。知道我做错了什么吗?

任何帮助深表感谢。

4

3 回答 3

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/-pthreadsgcc 选项。
  • 的内容OBJECTS = $(wildcard ./*/*.o)只有在正确$(MODULES)构建时才是正确的。删除它。
  • $(PROG)命令实际构建$(PROG)目标。
  • $(MODULES)命令通过调用相应目录中的 make 来构建模块。然后他们更新目录的时间戳以强制重建$(PROG). 由于它是递归的,因此它无法知道模块中是否实际更新了任何内容,因此它需要触发依赖于模块的任何内容的重建。

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

于 2013-08-07T09:14:49.257 回答
0

尝试这样做 -->

ifeq ($(ALLOW_BACKTRACE),1) 
  CFLAGS += -DALLOW_BACKTRACE 
 endif
于 2013-08-07T08:48:08.557 回答
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)第二:在我的实际构建步骤中,我必须在扩展后加上引号。一旦我这样做了,它就像一个魅力......可能是因为它的空间有问题。

感谢大家,他们不厌其烦地试图帮助我。

于 2013-08-07T09:10:39.350 回答