0

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

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

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

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

我怎样才能做到这一点?

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

4

2 回答 2

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
于 2014-05-05T15:28:05.113 回答
0

我会按照您的extconf.rb文件中的内容执行此操作

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

正如您在 have_library 的 api 文档中看到的那样,该方法have_library返回 true 或 false

于 2014-05-05T14:30:35.987 回答