我为第三方项目提供了一些大型make文件,这些文件由于链接器问题而无法构建。
从查看make文件,我认为它应该执行类似:
LIBS = -lm
CC = gcc
bin = bin
myapp: $(bin)/main.o $(bin)/other.o $(bin)/etc.o
$(CC) $(bin)/main.o $(bin)/other.o $(bin)/etc.o $(LIBS) -o myapp
gcc bin/main.o bin/other.o bin/etc.o -lm -o myapp
而不是错误,它似乎失败了类似的东西:它也没有将任何.o文件放在预期的bin / location中,只是将它们留在源目录中......
cc main.o -o myapp
但我无法找到可能来自的任何地方。有没有办法通过make文件获得某种堆栈跟踪?
我知道-n和-d,但似乎都没有告诉我什么目标行和文件yeilded那个命令,或者那里的哪一系列目标以及任何$()扩展的值(我期待的那个是唯一的myapp:我可以在任何一个makefile中找到...)
答案 0 :(得分:0)
查看--debug
选项。从我的联机帮助页:
- 调试[= FLAGS]
Print debugging information in addition to normal processing. If the FLAGS are omitted, then the behavior is the same as if -d was specified. FLAGS may be a for all debugging output (same as using -d), b for basic debugging, v for more verbose basic debugging, i for showing implicit rules, j for details on invocation of commands, and m for debugging while remaking makefiles.
答案 1 :(得分:0)
remake是一个非常好的选择,但是如下所示(保存为debug.mk
)也可以提供很好的帮助。它不会像重拍一样告诉你,但它可能会告诉你足够的开始。
# Use as: MAKEFILES=debug.mk make
OLD_SHELL := $(SHELL)
ifneq (undefined,$(origin X))
override X = -x
endif
SHELL = $(if $@,$(warning Running $@$(if $<, (from: $<))$(if $?, (newer: $?))))$(OLD_SHELL) $(X)
如果您想了解更多有关正在发生的事情的话,您也可以在那里打印出其他自动变量。