我如何指示Extconf.rb使用其他G ++优化标志,并且建议哪个?
-
23-10-2019 - |
题
我在用着 米 为红宝石宝石编写C ++扩展。扩展名为共享对象(.SO)文件的形式。
这需要“ MKMF-RICE”而不是“ MKMF”,但两者(AFAIK)非常相似。
默认情况下,编译器使用标志 -g -O2
. 。就我个人而言,我觉得这种愚蠢,因为启用了任何优化,很难进行调试。我求助于编辑makefile来取出我不喜欢的旗帜(例如,删除 -fPIC -shared
当我需要调试 main()
而不是红宝石的钩子)。
但是我认为有更好的方法。我知道我可以做
$CPPFLAGS += " -DRICE"
添加其他标志。但是,如何在不直接编辑makefile编辑的情况下删除东西呢?
次要问题:哪些优化对Ruby加载的共享对象是安全的?我可以做类似的事情吗 -funroll-loops
?你们都推荐什么?
这是一个科学计算项目,因此越快越好。内存不是很多问题。
非常感谢!
解决方案
快速而肮脏的方法是将-O0添加到CXXFLAG,这将关闭优化。以后的选项将覆盖较早的选项。
就插件的安全性而言,您应该能够执行任何不影响ABI的事情。没有测试,我不明白为什么-Funroll会。当然,安全并不意味着更好。正如人页面所指出的那样,“ -funroll-loops使代码更大,并且可能会或可能不会使其运行速度更快。”
其他提示
定义您使用
-D name=definition
就像您在示例中所做的一样:
$CPPFLAGS += " -DRICE"
-u名
取消任何先前的名称定义,即内置或提供-D选项。
$CPPFLAGS += " -URICE"
尽管我不确定它是否会像您想要的那样帮助Undewining -O2。
不隶属于 StackOverflow