我正在使用Rice为 Ruby gem 编写 C++ 扩展。扩展名采用共享对象 (.so) 文件的形式。
这需要“mkmf-rice”而不是“mkmf”,但两者(据我所知)非常相似。
默认情况下,编译器使用标志-g -O2
。就我个人而言,我觉得这种做法很愚蠢,因为启用任何优化都很难进行调试。我已经通过编辑 Makefile 来删除我不喜欢的标志(例如,当我需要使用 main()
进行调试时,删除 -fPIC -shared
Ruby 的钩子(Hook))。
但我认为必须有更好的方法。我知道我能做到
$CPPFLAGS += " -DRICE"
添加额外的标志。但是如何在不直接编辑 Makefile 的情况下删除内容呢?
第二个问题:哪些优化对于 Ruby 加载的共享对象是安全的?我可以做类似 -funroll-loops
的事情吗?大家有什么推荐的吗?
这是一个科学计算项目,所以越快越好。内存并不是什么大问题。
最佳答案
定义您使用
-D name=定义
就像您在示例中所做的那样:
$CPPFLAGS += " -DRICE"
-U name
Cancel any previous definition of name, either built in or provided with a -D option.
$CPPFLAGS += " -URICE"
尽管我不确定它是否有助于像您想要的那样取消定义 -O2。
关于c++ - 我如何指示 extconf.rb 使用额外的 g++ 优化标志,哪些是可取的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2962287/