我将如何指示extconf.rb使用其他g ++优化标志,并且建议使用这些标志?

问题描述 投票:2回答:2

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

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

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

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

$CPPFLAGS += " -DRICE"

添加其他标志。但是如何删除内容而不直接编辑Makefile?

另一个问题:对于Ruby加载的共享对象,哪些优化是安全的?我可以做类似-funroll-loops的事情吗?你们都推荐什么?

这是一个科学计算项目,因此速度越快越好。内存不是什么大问题。

c++ ruby shared-libraries compiler-optimization extconf.rb
2个回答
1
投票

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

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


2
投票

要使用的定义

-D name=definition

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

$CPPFLAGS += " -DRICE"

-U名称取消内置的或提供-D选项的名称的任何先前定义。

$CPPFLAGS += " -URICE"

尽管我不确定您是否愿意按定义-O2是否会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.