GNU Makefile子Shell问题:target_compile执行报错求助
问题分析与解决
这个错误的核心原因是你把Makefile的变量赋值语句写到了规则的命令块里——Makefile中,规则里缩进(必须是Tab键)的每一行都会被当作Shell命令执行,而PROJECT_SIM_OPTS += ...是Makefile的变量语法,并非Shell命令,所以Shell会报错说找不到这个"命令"。
修正方案一:将变量赋值移出命令块
如果你不需要这个变量赋值依赖copy_shared_object的执行结果(比如CURRENT_DIR是预先定义好的),直接把变量赋值放在规则外面,作为Makefile的顶层语句即可:
# 顶层变量赋值,不属于任何规则的命令块 PROJECT_SIM_OPTS += -LDFLAGS -L${CURRENT_DIR},-lm -load copy_shared_object: cp shared_object.so ${CURRENT_DIR} target_compile: copy_shared_object actual_compile_with_sim_opts ... actual_compile_with_sim_opts: ...
修正方案二:用$(eval)在规则内执行Makefile赋值
如果这个变量赋值必须在copy_shared_object执行后才生效(比如CURRENT_DIR是在这个目标里动态生成的),可以用Makefile的$(eval)函数,告诉Makefile这是一条Makefile语句,而非Shell命令:
copy_shared_object: cp shared_object.so ${CURRENT_DIR} $(eval PROJECT_SIM_OPTS += -LDFLAGS -L${CURRENT_DIR},-lm -load) target_compile: copy_shared_object actual_compile_with_sim_opts ... actual_compile_with_sim_opts: ...
额外注意
Makefile规则的命令块里,每一行都会启动一个独立的Shell进程,所以即使你想设置Shell环境变量,也要用Shell的语法(比如export PROJECT_SIM_OPTS="$PROJECT_SIM_OPTS -xxx"),但这里你要的是Makefile自身的变量,所以必须用Makefile的语法来处理,不能混同Shell命令。
内容的提问来源于stack exchange,提问作者tulamba
相关产品推荐
相关产品推荐

