在运行时使用makefile复制一个文件

6
我以前在Windows上使用批处理脚本编译我的程序,但最近发现Makefile更高效。
我原来在.bat文件中有一行代码,在运行时将一些dll文件复制到当前目录,这个方法非常有效。
copy C:\lib\glfw\glfw.dll 

我在我的 makefile 中尝试了相同的命令行,甚至尝试了替代的cp,但是尽管文件位于我指定的位置,我的终端仍然打印出这个错误。

process_begin: CreateProcess(NULL, copy C:\lib\glfw\glfw.dll, ...) failed
make (e=2): The system cannot find the file specified.
make: *** [core.exe] Error 2

这是我使用的完整makefile。请注意,除了复制行之外,它都可以正常工作。我做错了什么或者这可能吗?

EXEC = core.exe
OBJS = src/obp.o

CC = g++

CFLAGS  = -W -Wall
LIBS    = -lSOIL -lglew32 -lglfw -lopengl32
LDFLAGS =

$(EXEC): $(OBJS)
    $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
    copy C:\lib\glfw\glfw.dll

clean:
    rm -f $(EXEC) $(OBJS) *~

也许是找不到 copy 命令?你为什么要使用 rm 呢,它能找到吗?你是在 MSYS 环境下运行吗? - Reinier Torenbeek
2个回答

5

看起来你正在运行这个命令在一个 MSYS (或者 MinGW) 环境中,该环境不支持使用 copy 命令。相反,你可以使用以下命令:

cp C:\lib\glfw\glfw.dll .

如果你想避免类Unix的cp命令,那么你可以像下面这样使用xcopy:
xcopy //Y C:\lib\glfw\glfw.dll

请注意双斜杠//是必须的,用于转义/
或者您可以在常规的MS-DOS环境下运行此命令,但这种情况下,您的clean目标将无法正常工作,因为无法找到rm,应该使用del
在当前设置中,任何内置的DOS命令都将找不到。请参阅选择 shell以了解make如何确定要使用哪个 shell。

我一开始就在 DOS 环境下运行它,但是 CP 也无法工作。 - iKlsR
我只能想到一些调试步骤。你知道它从哪里获取 rm 吗?你能在命令提示符中执行 where rm 吗?(只有在您拥有较新的支持 where 的 Windows 版本时才有意义)。另外,你的 $(SHELL)$(MAKESHELL) 的值是多少?你可以在你的 makefile 中使用类似于 $(info SHELL = $(SHELL)) 的语句来打印它们。 - Reinier Torenbeek
不知道这是否有帮助,但 $(info SHELL...) 返回 SHELL = C:/MinGW/msys/1.0/bin//sh.exe,而 rm 的位置为 C:\MinGW\msys\1.0\bin\rm.exe。 - iKlsR
是的,这确实有帮助。所以你正在运行一个MSYS shell,而没有意识到它。你可以从刚才打印的路径中看到这一点。这意味着我的原始答案应该有效。当使用cp时,您遇到了什么错误?您没有忘记在cp命令的末尾添加句号吧? - Reinier Torenbeek
X_x.. 我忘记了 . :D.. 它可以工作。谢谢.. 顺便问一下,它是做什么的? - iKlsR
cp 是 *nix 系统下的 copy 命令,用法为 cp <源文件> <目标文件>。目标文件是必须的,. 表示当前目录为目标文件夹。我更新了答案以提供更多信息。 - Reinier Torenbeek

0

您可能需要将反斜杠加倍,以便make理解您的意图:

copy c:\\lib\\glfw\\glfw.dll

Make 源自 Unix 背景,其文件分隔符为 /,因此在 Windows 环境中使用时有时会有些棘手。


它使用\打印新行,但与上面相同的错误。 - iKlsR
也许你可以尝试使用 /,但我不确定 copy 命令是否能理解。 - Greg Hewgill
我使用Scons来构建Blender,但是不行。我希望尽可能保持简单。 *编辑 - 我可能会尝试一下。 - iKlsR

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接