c++ - 我如何指示 extconf.rb 使用额外的 g++ 优化标志,哪些是可取的?

标签 c++ ruby shared-libraries compiler-optimization extconf.rb

我正在使用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/

相关文章:

c++ - 在 makefile 中编写依赖项,使用 makefile

c++ - 在 C++ 中从文本文件加载变量

c++ - 如何从主窗口切换到辅助页面?

ruby-on-rails - 如何在单个项目上运行每个循环?

ruby - 在 ruby​​ 中编写嵌套 "for"的另一种有效方法?

Xcode "ld: library not found [...] for architecture x86_64"

linux - 共享对象可以有自己的线程在后台运行吗?

c++ - sprintf() 乱码输出

c++ - 代码崩溃,没有逻辑错误

ruby - rake 重新请求 :work fails with simple example