2

我正在使用Rice为 Ruby gem 编写 C++ 扩展。扩展名采用共享对象 (.so) 文件的形式。

这需要'mkmf-rice'而不是'mkmf',但两者(AFAIK)非常相似。

默认情况下,编译器使用标志-g -O2。就个人而言,我觉得这种做法很愚蠢,因为启用任何优化都很难进行调试。我求助于编辑 Makefile 来删除我不喜欢的标志(例如,-fPIC -shared当我需要使用main()而不是 Ruby 的钩子进行调试时删除)。

但我认为必须有更好的方法。我知道我能做到

$CPPFLAGS += " -DRICE"

添加其他标志。但是如何在不直接编辑 Makefile 的情况下删除东西呢?

第二个问题:对于 Ruby 加载的共享对象,哪些优化是安全的?我可以做类似的事情-funroll-loops吗?大家有什么推荐的?

这是一个科学计算项目,所以越快越好。内存不是什么大问题。

4

2 回答 2

2

要定义你使用

-D name=definition

就像您在示例中所做的那样:

$CPPFLAGS += " -DRICE"

-U name
取消任何以前的 name 定义,无论是内置的还是由 -D 选项提供的。

$CPPFLAGS += " -URICE"

虽然我不确定它是否有助于像你想要的那样取消定义 -O2 。

于 2010-06-03T07:08:40.877 回答
1

快速而肮脏的方法是将 -O0 附加到 CXXFLAGS,这将关闭优化。后面的选项将覆盖前面的选项。

就插件的安全性而言,您应该能够做任何不影响 ABI 的事情。没有测试,我不明白为什么 -funroll 会。当然,安全并不意味着更好。如手册页所述,“-funroll-loops 使代码变大,可能会或可能不会使其运行得更快。”

于 2010-06-02T23:17:31.813 回答