2016-09-11 15 views
0

我正在构建一个相对简单的C扩展来计算使用libpng的PNG文件中的像素;我内置在C原始版本和它编译(和作品)的罚款在Cygwin中使用以下命令:如何链接Ruby库扩展中的C库

的gcc -o shadow_counter shadow_counter.c -lpng

如果我不包括“ -lpng“命令,它在尝试读取libpng函数(”undefined reference to png_sig_cmp'“等等)时不会编译和踢出一堆错误。

为了将它打包为ruby,我把一起gemspec和文件和文件夹,并将其建成宝石:

宝石打造shadow_png.gemspec

然后我头向PowerShell和安装宝石:

创业板安装shadow_png-0.0.1.gem

如果我离开出来libpng的东西,它安装得很好,并按照它应该的方式与Ruby交谈。但是一旦我开始尝试引用libpng函数并尝试安装它,它会开始踢出我上面看到的SAME错误(未定义的引用“png_sig_cmp”等)。所以我的理论是,不知何故链接命令-lpng不包括在内。

作为流程的一部分,我如何包含这些说明?这是我需要添加到gemspec的东西吗?或者建立宝石的命令?或者它是否必须在宝石安装中发生?

谢谢!

回答

1

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

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

我认为这是一些前瞻性的进步......与添加在安装宝石时,我得到了以下错误: '在-lpng ...没有 检查的main()缺少PNG库.' 这是否意味着我需要在extconf.rb文件中的某处需要libpng? – asetniop

+0

我不知道什么库函数是一个很好的入库点,但我会假设你可以使用'have_library('png','func_name')'用你正在使用的任何函数......如果这样做不起作用,您可以考虑使用'LDLIBS'或'LDFLAGS'手动编辑链接器标志。 [这是一个例子](https://github.com/boazsegev/iodine/blob/306f6b5b24b718693d5368e3ecb8a7575e51a732/ext/iodine/extconf.rb#L11-L37)来编辑环境(在这个例子中选择了一个编译器)。 – Myst