【问题标题】:How to link C library in Ruby extension如何在 Ruby 扩展中链接 C 库
【发布时间】:2016-09-11 03:09:40
【问题描述】:

我正在构建一个相对简单的 C 扩展来使用 libpng 计算 PNG 文件中的像素;我在 C 中构建了原始版本,它在 Cygwin 中使用以下命令编译(并且可以正常工作):

gcc -o shadow_counter shadow_counter.c -lpng

如果我不包含“-lpng”命令,它将无法编译并在尝试读取 libpng 函数时抛出一堆错误(“未定义对 `png_sig_cmp' 的引用”等)

为了给ruby打包,我把gemspec和文件和文件夹放在一起,构建成一个gem:

gem build shadow_png.gemspec

然后我前往 Powershell 并安装 gem:

gem install shadow_png-0.0.1.gem

如果我省略了 libpng 的内容,它可以正常安装并以应有的方式与 Ruby 对话。但是,一旦我开始尝试引用 libpng 函数并尝试安装它,它就会开始排除我在上面看到的相同错误(未定义对 `png_sig_cmp' 的引用等)。所以我的理论是不包括链接命令 -lpng 。

如何将这些说明作为流程的一部分?我需要添加到 gemspec 中吗?还是构建 gem 的命令?还是必须在 gem 安装中发生?

谢谢!

【问题讨论】:

    标签: c ruby libpng


    【解决方案1】:

    我认为您正在寻找 have_library 方法,将其放入您的 extconf.rb 文件中。

    即

    abort 'Missing PNG library.' unless have_library('png')
    

    【讨论】:

    • 我认为这是一些进步......添加了这个后,我在安装 gem 时收到以下错误:checking for main() in -lpng... no Missing PNG library. 这是否意味着我需要在 extconf.rb 文件中的某处需要 libpng?
    • 我不确定哪个库函数是该库的良好入口点,但我假设您可以将have_library('png', 'func_name') 与您正在使用的任何函数一起使用...如果这不是工作,您可以考虑使用LDLIBS 或LDFLAGS 手动编辑链接器标志。 Here's an example 用于编辑环境(在示例中选择了编译器)。
    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多