Readlink未找到C文件(MSYS)

时间:2015-07-24 17:45:27

标签: c makefile msys readlink

前段时间我问了一个关于这个问题的问题,并且解决了#34;它通过使用Cygwin而不是其XWin实用程序,但我再次回到这个问题,因为Xwin实用程序不使用我的GPU并因此在模拟中造成严重的瓶颈。另一方面,MinGW / MSYS使用我的GPU进行渲染,这是一个巨大的帮助,但是有一些需要平滑的粗糙区域,特别是使用readlink。

基本上,用于反弹的src / makefile(https://github.com/hannorein/rebound)说明了这一点:

PREDEF+= -D$(shell basename `readlink gravity.c` '.c' | tr '[a-z]' '[A-Z]')
PREDEF+= -D$(shell basename `readlink boundaries.c` '.c' | tr '[a-z]' '[A-Z]')
PREDEF+= -D$(shell basename `readlink collisions.c` '.c' | tr '[a-z]' '[A-Z]')

如果我的理解是正确的,那么应该找到我指定的重力,边界和碰撞的版本,并将其添加到PREDEFS,以便编译器使用正确的重力,边界和碰撞版本。但是,它似乎在MSYS中不起作用。最后吐出预定义的是:

-DOPENGL -D.C -D.C -D.C

显然它没有从上面的代码中得到任何回报。当然,这导致macronames必须是标识符错误。我可以通过在readlink和文件名之间添加任何特殊选项来解决这个问题,例如-f,但是它只会吐出来

-DOPENGL -DGRAVITY -DBOUNDARIES -DCOLLISIONS

哪个不对,因为它应该有额外的位,如下:

-DOPENGL -DGRAVITY_DIRECT -DBOUNDARIES_OPEN -DCOLLISIONS_NONE

现在,如果我不想要任何特殊的重力,边界或碰撞,那么解决方法是可以的,但仅仅因为(我猜测)它默认为那些没有特殊指定的那些在每个macroname之后。但是,如果我想要一些特殊的东西,比如更高效的重力树代码或实际的碰撞,那么由变通方法产生的缩短的名称将无法帮助它找到任何东西,因此它会导致编译错误,因为它需要从特殊文件中获得某些函数显然不见了。

所以我现在很困难。我非常希望能够使用除默认值之外的其他代码,但是MSYS在readlink中表现得很有趣而没有找到合适的东西。正如我所说,它在X windows风格的编译器中运行良好。我觉得必须有一些我缺少的库或一些隐藏的语法断开我忽略了需要在XWin和非Xwin编译之间考虑,但我找不到任何东西。

这是一个应该阅读的链接示例(至少我认为这是正在阅读的内容,我还在学习makefile):

ln -fs gravity_tree.c ../../src/gravity.c
ln -fs boundaries_open.c ../../src/boundaries.c
ln -fs collisions_none.c ../../src/collisions.c

如果有人能告诉我为什么这会在Xwin命令行上运行而不是MSYS,我会非常感激。

1 个答案:

答案 0 :(得分:0)

为什么您希望readlink在MSYS中工作?你在哪里获得了readlink.exe被调用的任何内容(如果这是正在执行的内容)? 标准 MSYS安装中没有readlink命令。也许你是在MinGW.org的msys-coreutils-ext包中发现的?如果是这种情况,您应该注意该软件包描述中的注释(通过MinGW.org的mingw-get安装程序看到):

  

msys-coreutils-bin子包包含那些历史上是标准MSYS安装的一部分的应用程序。相关的msys-coreutils-ext子包包含已经(名义上)移植到MSYS的其余coreutils应用程序 - 通常这些应用程序不经常使用,并且不能保证工作:例如已知'su.exe','chroot.exe'和'mkfifo.exe'已被破坏。

并且,似乎我们可能会将readlink.exe添加到“已知被破坏”的应用程序列表中。

值得注意的是readlink 在支持工具列表中,允许GNU Coding Standards一致的应用程序从其{{1}调用脚本或其configure。因此,MinGW.org开发人员(维护MSYS的人)没有什么动力来解决使makefile工作的问题,(尽管来自独立开发人员的补丁会受到欢迎)。

作为最终资格认证,以及对问题说明的一条评论,readlink.exe会创建副本文件;它创建符号链接。怎么可能呢? MSYS本身可以追溯到 windows 不支持符号链接的时代......事实上,即使在今天它对它们的支持也是不稳定的。在MSYS发布时,复制文件或创建NTFS 链接,是MSYS可以提供​​的最佳折衷方案,在脚本调用ln -s的情况下。因此,提交补丁以使ln -s工作的任何开发人员都有责任解决更新readlink.exe的问题,以便它可以创建符号链接(以OS版本依赖的方式) ,然后ln.exe会读。

如果这不是您希望的答案,我很抱歉,但除非有人投入更新MSYS,以便它可以利用更新的Windows版本中的(不可靠)符号链接功能,然后你需要找到一种不同的方法;当前的MSYS不支持符号链接,即使底层操作系统现在也是如此。