我正在使用Rice为Ruby gem编写C ++扩展。扩展名是共享对象(.so)文件的形式。
这需要'mkmf-rice'而不是'mkmf',但是两者(AFAIK)非常相似。
默认情况下,编译器使用标志-g -O2
。就个人而言,我发现这种愚蠢的做法是,启用任何优化都很难调试。我不得不编辑Makefile来取出我不喜欢的标志(例如,当我需要使用-fPIC -shared
而不是Ruby的钩子进行调试时,删除main()
)。
但是我认为必须有更好的方法。我知道我可以做到
$CPPFLAGS += " -DRICE"
添加其他标志。但是如何删除内容而不直接编辑Makefile?
另一个问题:对于Ruby加载的共享对象,哪些优化是安全的?我可以做类似-funroll-loops
的事情吗?你们都推荐什么?
这是一个科学计算项目,因此速度越快越好。内存不是什么大问题。
快速而肮脏的方法是将-O0附加到CXXFLAGS,这将关闭优化。以后的选项将覆盖以前的选项。
关于插件的安全性,您应该能够做任何不影响ABI的事情。没有测试,我看不出为什么-funroll会这么做。当然,安全并不意味着更好。如手册页所述,“-funroll-loops使代码变大,并且可能会或可能不会使它运行得更快。”
要使用的定义
-D name=definition
就像您在示例中所做的那样:
$CPPFLAGS += " -DRICE"
-U名称取消内置的或提供-D选项的名称的任何先前定义。
$CPPFLAGS += " -URICE"
尽管我不确定您是否愿意按定义-O2是否会有所帮助。