不久前我问了一个关于这个主题的问题,并通过使用 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 中不起作用。它最终为 predefs 吐出的是:
-DOPENGL -D.C -D.C -D.C
显然它没有从上面的代码中得到任何回报。当然,这会导致宏名必须是标识符错误。我可以通过在 readlink 和文件名之间添加任何特殊选项来解决这个问题,例如 -f,但它只会吐出
-DOPENGL -DGRAVITY -DBOUNDARIES -DCOLLISIONS
这是不对的,因为它应该有额外的位,如下所示:
-DOPENGL -DGRAVITY_DIRECT -DBOUNDARIES_OPEN -DCOLLISIONS_NONE
现在,如果我不想要任何特殊的重力、边界或碰撞,解决方法是可以的,但只是因为(我猜)它默认为那些在每个宏名之后没有特殊指定的情况。但是,如果我确实想要一些特殊的东西,比如更有效的重力树代码或实际的碰撞,则由变通方法产生的缩短名称将无助于它找到任何东西,因此它会导致在编译为特殊文件所需的某些函数时出错显然是失踪了。
所以我现在很困。我非常希望能够使用默认值以外的其他代码,但是 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 上工作,我将不胜感激。