【发布时间】:2015-10-15 11:46:18
【问题描述】:
不久前我问了一个关于这个主题的问题,并通过使用 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 上工作,我将不胜感激。
【问题讨论】:
-
ls -l对来自任何终端/等的src/gravity/*.c文件说了什么。你是从哪里运行的?如果您运行make SHELL+=-x,您应该能够在输出中看到对readlink的调用,这可能会告诉您一些有用的信息。 -
对不起,我不确定这是否是您的意思,但是在所有重力 *.c 文件都可以正常工作的 src 文件夹中的文件夹中使用 ls -l ,gravity_tree.c,grape_grape.c,gravity_fft.c 和其他一些,虽然我不确定这是否是你想要的信息。至于 make SHELL+=-x,我尝试在 MSYS 中运行它,但它不知道如何处理 -x。
-
你试图运行到底发生了什么,到底发生了什么?随着更新的使你需要
make SHELLFLAGS+=-x我认为或者可能是make SHELLFLAGS+=' -x'。 -
我在
../../src/目录中请求了ls -l。 -
它没有找到命令 -x,但它没有
SHELLFLAGS+=-x的那个问题。但是输入make SHELLFLAGS+=-x后,运行正常,但是没有显示额外的信息;这是编译器显示的内容:[i.imgur.com/U1O4qp1.png]