使用extconf.rb设置预处理器定义

时间:2014-05-05 09:37:01

标签: c ruby extconf.rb

我正在为Ruby编写C扩展,我在extconf.rb文件中有类似的内容:

if(not have_library('z'))
        $stderr << "Error, could not locate zlib.\n"
        abort "Missing zlib"
end

因此,如果缺少zlib,安装过程将中止。相反,由于我的扩展可以使用AND而不使用zlib,我想做类似以下的事情;

if(have_library('z'))
        # do something so that -DHAVE_ZLIB is passed to the compiler
        # when compiling the extension.
end

我该怎么做?

编辑:问题在于if ... end语句中的注释:如何为编译器添加-DHAVE_ZLIB定义?

2 个答案:

答案 0 :(得分:2)

如果您可以依赖于检查标头文件,那么have_header将为您定义HAVE_HEADER_H宏。例如:

have_header('zlib.h')

将定义HAVE_ZLIB_H,然后您可以在代码中引用它。

如果这还不够,或者由于其他原因需要定义宏,则可以使用$defs全局:

if(have_library('z'))
  $defs << '-DHAVE_ZLIB'
  # Now HAVE_ZLIB will be defined for you to check in your code
end

答案 1 :(得分:0)

我会按照以下extconf.rb文件

进行操作
$libs = ["-lliba", "-llibb"]
if have_library('z')
  # where $libs is your array of libraries defined
  $libs << "-llibz"
end

如您所见[{3}},方法have_library将返回true或false