我正在尝试移植一个在 linux 中使用的 make 文件,以便能够在 windows 中工作,对一些错误感到困惑

问题描述 投票:0回答:1

在制作过程中的某个时刻,我正在这样做:

@copy $(OUTPUT_HEX) $(BUILD_DIR)$(OUTPUT_NAME)_$(VARIANT_MODE)_new.hex

因为这不起作用,我在同一目录中尝试了以下命令:

copy /Y build\debug\0821_0822_CON_debug.hex build\debug\hello_new.hex

这个命令在cmd上运行,没问题。当我在 makefile 中尝试完全相同的命令时,我收到一条错误消息,提示系统找不到特定路径。

所以我的猜测是,由于未知原因,构建是从另一条路线创建的,所以在运行命令之前,我这样做:

@cd C:/Users/john/git/0821_0822/01_Control/app
@copy /Y build/debug/0821_0822_CON_debug.hex build/debug/hola_app_only.hex

相同的目录我在cmd中使用复制命令,它在那里工作,我不明白为什么它不工作。

我试过一些

@echo $(CURDIR)

执行 cd 之前和之后,目录似乎是正确的,但 cd 实际上似乎不起作用,因为如果我将其更改为另一个目录,目录仍然相同。

我真的很困惑。

顺便说一下,我在 ST32CubeIDE 中做这个,除了我必须做的之外别无选择。

谢谢!

makefile stm32
1个回答
1
投票

首先,pmacfarlane 是 100% 正确的。在您的 makefile 100% 正确工作之前,使用

@
是一个坏主意。您不会尝试通过首先将所有输出重定向到
/dev/null
来调试您的程序:这是等价的。

第一个问题是这并没有按照您的想法去做:

@cd C:/Users/john/git/0821_0822/01_Control/app
@copy /Y build/debug/0821_0822_CON_debug.hex build/debug/hola_app_only.hex

makefile 配方中的每个逻辑行都在 不同的 shell 中运行,这意味着只要命令退出,对本地 shell 环境的任何更改(例如设置环境变量或更改工作目录)都会丢失。所以这里的第一个命令是空操作:它启动一个 shell,更改目录,然后退出 shell,目录更改就消失了。

第二,在 Windows 中编写 makefile 非常棘手,因为有太多不同的可能方法来做事。 Make 调用一个 shell,但它调用的是什么 shell?是在调用

cmd.exe
吗?它是在调用 Powershell 吗?它是否调用您安装的 POSIX shell(比如作为 Git for Windows 的一部分)?

这很重要,因为与 UNIX 系统不同,您在 Windows shell 中运行的许多程序都是 shell 内置的;例如,包括

copy
。这意味着如果您启动不同的 shell,则不能将它们作为独立程序运行。

所以在我看来,您的

make
版本正在您的 PATH 上找到 UNIX shell
sh.exe
,因此它使用它作为 shell 来调用命令,当然这不允许
copy
工作。

解决此问题的最简单方法是显式设置要运行的 shell。例如,您可以将其添加到您的 makefile 中:

SHELL := cmd.exe
© www.soinside.com 2019 - 2024. All rights reserved.