【问题标题】:Copy a file using a makefile at runtime在运行时使用 makefile 复制文件
【发布时间】:2012-08-01 00:33:00
【问题描述】:

我曾经在 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

这是我正在使用的完整生成文件。请注意,没有复制行它就像一个魅力..我做错了什么或者这可能吗?

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 环境中运行它吗?

标签: makefile copy cp


【解决方案1】:

您似乎是在不了解 copyMSYS(或 MinGW)环境中运行此程序。相反,您可以使用

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

如果你想避免像cp 这样的*nix,那么你可以使用xcopy,如下所示:

xcopy //Y C:\lib\glfw\glfw.dll

注意转义 / 所需的双 //

或者您可以在常规的MS-DOS 环境中运行它,在这种情况下,您的clean 目标将不起作用,因为找不到rm,您应该使用del

使用您当前的设置,将找不到任何内置的DOS 命令。请参阅 Choosing the shell 以了解 make 如何确定使用哪个 shell。

【讨论】:

  • 我从一开始就在dos环境中运行它,cp也不起作用。
  • 我只能做一些调试步骤。你知道它从哪里得到rm 吗?你能在命令提示符下做where rm 吗? (这仅在您拥有支持where 的较新的Windows 版本时才有意义)。另外,$(SHELL)$(MAKESHELL) 的值是多少?您可以使用顶部的$(info SHELL = $(SHELL)) 之类的内容从您的makefile 打印它们。
  • 不知道这是否有帮助,但 $(info SHELL...) 返回 SHELL = C:/MinGW/msys/1.0/bin//sh.exe 并且 rm 打印 C:\MinGW\msys\ 1.0\bin\rm.exe
  • 是的,这确实有帮助。因此,您正在运行MSYS shell,却没有意识到这一点。您可以从刚刚打印的路径中看到这一点。这意味着我原来的答案应该有效。使用cp 时遇到什么错误?你没有忘记在cp 命令的末尾加上句号吗?
  • X_x.. 我忘记了. :D.. 它有效。谢谢.. 顺便说一句,它有什么作用?
【解决方案2】:

您可能需要将反斜杠加倍,以便make 了解您想要的内容:

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

Make来自Unix背景,文件分隔符为/,因此在Windows环境中使用有时会有点尴尬。

【讨论】:

  • 它使用 \\ 打印新行,但与上面的错误相同。
  • 也许你可以尝试使用/,但我不确定copy 命令是否能理解。
  • 我使用 scons 来构建搅拌机,但没有。我想让这个尽可能简单。 *编辑 - 我可能会尝试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-21
  • 2015-02-07
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
相关资源
最近更新 更多