不确定其他人是否已经让这个工作,但即使在我的 Makefile 中运行以下简单行,我也没有尽头的麻烦mingw32-make
:
mklink Mk Makefile
以下创建了链接,但mingw32-make
随后吐出并抛出错误 255:
$(shell cmd /c 'mklink Mk Makefile')
没有其他问题,而且我有一个相对复杂的makefile。只有mklink
这样做。(显然 msys 有它自己的问题,ln
所以沿着这条路走下去似乎毫无意义。)
如果我在以管理员权限运行的 shell 中调用它,以下对我有用(在 Win7 Home Premium 上,在 VirtualBox 中) :
$ cat makefile.tst
all:
cmd /c "mklink mk makefile.tst"
@echo "Success!"
$ make -f makefile.tst
cmd /c "mklink mk makefile.tst"
symbolic link created for mk <<===>> makefile.tst
Success!
$ rm mk
$ mingw32-make -f makefile.tst
cmd /c "mklink mk makefile.tst"
symbolic link created for mk <<===>> makefile.tst
Success!
我的外壳,在这种情况下是 MSYS ,通过从UAC 升级到管理员权限sh.exe
调用。这样我就可以证明该命令在 MSYS 自己的和;中都有效。(当然,该示例也可以直接从提升的外壳本身工作)。msys.bat
cmd.exe
mklink
make.exe
mingw32-make.exe
mingw32-make.exe
cmd.exe
我怀疑尝试mklink
直接在makefile中使用,没有cmd /c
序言,可能不起作用,因为mklink
它是cmd.exe
内置的,GNU make可能不知道以这种方式运行......它报告CreateProcess
失败,因为找不到指定的文件,当我尝试它时。
您使用make的$(shell ...)
构造将不起作用,因为这会导致make在错误的操作阶段调用命令......在解析makefile本身并构建其依赖关系图时,而不是作为包含规则时运行的命令被调用,它现在将尝试将命令的输出$(shell ...)
作为自己的命令执行;这显然不是你想要的!
只是为了澄清关于 MSYS 自己的ln
命令的立场:在最初实施它的 Windows 版本的限制范围内,它确实可以预期的那样工作。尤其是:
$ ln fileA fileB
在支持此类链接的文件系统(如 NTFS)上创建文件到文件的硬链接,然后回退到在不支持此类链接的文件系统(如 FAT)上创建副本。还:
$ ln dirA dirB
失败了,因为它应该;硬链接目录是灾难的根源,并且是不允许的(就像它们在 unix 平台上被禁止一样)。然而:
$ ln -s fileA refB
不会创建符号链接,(因为在开发 MSYS 时没有任何版本的 Windows 支持它们,并且没有人进一步实现该功能,因为它们已经可用......尽管它们的实现似乎仍然不稳定,无论如何在 Vista 和 Win7 上);相反,如果可能,此命令会退回到创建硬链接,否则会创建文件副本。相似地:
$ ln -s dirA refB
不会创建符号目录链接,在这种情况下,没有回退;它只是无条件地失败!(有人可能会争辩说,目录的深层副本可能是一个合适的回退操作,但它并没有这样实现;相反,lndir
提供了命令来促进这一点)。