2016-09-11 37 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