我读了这个问题,我很惊讶它不起作用:
所以我自己尝试了,并得到了相同的结果.这是一个示例makefile:
define foo
bar
baz
endef
define bar =
foo
baz
endef
$(info foo: $(foo))
$(info bar: $(bar))
all:
Run Code Online (Sandbox Code Playgroud)
这是运行它的输出:
$ make
foo: bar
baz
bar:
make: Nothing to be done for `all'.
Run Code Online (Sandbox Code Playgroud)
这里发生了什么事?在GNU进行手动似乎表明,这两个变量的声明应该是一样的-我错过什么吗?
编辑:
我所指的手册中的一些引用:
Run Code Online (Sandbox Code Playgroud)define immediate deferred endef define immediate = deferred endef以下是定义罐装食谱的示例:
Run Code Online (Sandbox Code Playgroud)define run-yacc = yacc $(firstword $^) mv y.tab.c $@ endef...如果您愿意,可以省略变量赋值运算符.如果省略,make假定它为'='并创建递归扩展变量...
如您所见,罐装食谱部分明确使用了该=案例.我正在使用GNU Make 3.81.
我有一个相当大的项目(4272 .o 文件),但无法将其与 GNU Make 链接。我遇到了make: /bin/sh: Argument list too long。这是一个使用 qmake 生成 makefile 的 Qt 5 项目。
我知道有很多关于此的问题,但我不知道如何将任何解决方案应用于我的问题。我也不完全确定为什么我在链接步骤中遇到这个问题。我得到的错误是:
make: /bin/sh: Argument list too long
用于链接我的项目的 makefile 条目如下所示:
build/debug/my_target/my_target: $(OBJECTS)
@test -d build/debug/my_target/ || mkdir -p build/debug/my_target/
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
Run Code Online (Sandbox Code Playgroud)
它扩展到类似:
@echo linking /build/debug/my_target/my_target && clang++ -ccc-gcc-name g++ -lc++ -L/path/to/licensing/lib -Wl,-rpath,/path/to/qt/lib -Wl,-rpath-link,/path/to/qt/lib -o build/debug/my_target/my_target build/debug/my_target/obj/object1.o build/debug/my_target/obj/object2.o ... build/debug/my_target/obj/object4272.o ... [ a bunch of moc_X.o ] ... [ a bunch of libs ] …Run Code Online (Sandbox Code Playgroud)