mingw32-make + mklink ...只是相处不来?

mingw32-make + mklink... just not getting along?

不确定是否有其他人已经使它工作,但即使在我的 Makefile 中使用以下简单的行,我也遇到了无穷无尽的麻烦 运行 mingw32-make:

mklink Mk Makefile

下面创建了 link,但是 mingw32-make 吐了并且此后抛出错误 255:

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

其他都没有问题,我的makefile比较复杂。只有 mklink 正在这样做。 (显然 msys 在 ln 方面有自己的问题,所以沿着这条路走下去似乎毫无意义。)

以下对我有用,(在 Win7 Home Premium 上,在 VirtualBox 中), 提供 我以 shell 运行 管理员权限调用它:

$ 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!

My shell,在本例中是 MSYS sh.exe,通过 msys.batcmd.exe 调用,UAC 升级为管理员权限。这样我就可以证明 mklink 命令在 MSYS 自己的 make.exemingw32-make.exe 中都有效; (当然,mingw32-make.exe 示例也可以直接从提升的 cmd.exe shell 本身运行。

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

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

只是为了澄清关于 MSYS 自己的 ln 命令的立场:它 确实 可以预期地工作,在版本的限制内Windows 它最初是在其上实现的。特别是:

$ ln fileA fileB

在支持此类 link 的 NTFS 等文件系统上创建文件到文件 hard link,然后回退到在 FAT 等文件系统上创建 copy,而 FAT 则不会。还有:

$ ln dirA dirB

失败了,这是应该的;硬 linked 目录是灾难的根源,是不允许的(就像它们在 unix 平台上被禁止一样)。然而:

$ ln -s fileA refB

不会创建符号link,(因为在开发MSYS时没有Windows版本支持它们,而且没有人向前推进实施该功能,因为它们已经可用……尽管,无论如何,它们的实施在 Vista 和 Win7 上似乎仍然不稳定);相反,如果可能,此命令回退到创建 hard link,否则创建文件副本。同样:

$ ln -s dirA refB

不会创建符号目录link,在这种情况下,没有回退;它只是无条件地失败了! (可能有人认为目录 的深拷贝可能 是一个合适的回退操作,但它并没有这样实现;相反,提供了 lndir 命令,以促进这一点)。