0

不确定其他人是否已经让这个工作,但即使在我的 Makefile 中运行以下简单行,我也没有尽头的麻烦mingw32-make

mklink Mk Makefile

以下创建了链接,但mingw32-make随后吐出并抛出错误 255:

$(shell cmd /c 'mklink Mk Makefile')

没有其他问题,而且我有一个相对复杂的makefile。只有mklink这样做。(显然 msys 有它自己的问题,ln所以沿着这条路走下去似乎毫无意义。)

4

2 回答 2

1

如果我在以管理员权限运行的 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.batcmd.exemklinkmake.exemingw32-make.exemingw32-make.execmd.exe

我怀疑尝试mklink直接在makefile中使用,没有cmd /c序言,可能不起作用,因为mklink它是cmd.exe内置的,GNU make可能不知道以这种方式运行......它报告CreateProcess失败,因为找不到指定的文件,当我尝试它时。

您使用make的$(shell ...)构造将不起作用,因为这会导致make在错误的操作阶段调用命令......在解析makefile本身并构建其依赖关系图时,而不是作为包含规则时运行的命令被调用,它现在将尝试将命令的输出$(shell ...)作为自己的命令执行;这显然不是你想要的!

于 2015-07-05T21:47:08.217 回答
1

只是为了澄清关于 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提供了命令来促进这一点)。

于 2015-07-05T23:03:36.047 回答