Как статически связать внешние библиотеки при компиляции расширения Ruby C

Я создаю расширение Ruby C для Windows, для которого требуются некоторые внешние библиотеки C, в частности libcurl и его зависимости. У меня есть файлы DLL и.a curllib. Однако, когда я собираюсь с помощью extconf.rb, он всегда динамически связывает библиотеки, что требует, чтобы кто-то установил curl и в своем пути к Windows использовал скомпилированное расширение. Вместо этого я хочу, чтобы extconf.rb статически связывал curl и его зависимости, чтобы любой мог использовать расширение для окон без необходимости сначала добавлять curllib к своему пути.

Это мой extconf.rb

require 'mkmf'

# Name the extension.
extension_name = 'ConnectionManager'
dir_config("curl")

# Make sure the cURL library is installed.
have_library("curl")

# Create the Makefile.
create_makefile(extension_name)

Это команда, с которой я создаю свой make-файл

ruby extconf.rb --with-curl-dir=C:/Knapsack/x86-windows

Есть ли что-то, что я могу добавить в мой файл extconf.rb или команду, чтобы заставить ruby ​​статически связать внешние библиотеки с моим расширением c? Буду признателен за любую помощь, и, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

2 ответа

У меня была похожая проблема при написании собственного расширения с использованием gif_lib в Linux.

Попробуйте добавить следующее в ваш extconf.rb:

unless find_library("curl", "curl_version")
  abort "curl is not installed, please install and try again"
end

Функция find_library возвращает true, если библиотека и точка входа присутствуют, и имеет побочный эффект добавления ее к опции -l в gcc.

Я нашел эти ссылки полезными: http://tenderlovemaking.com/2010/12/11/writing-ruby-c-extensions-part-2.html

Вот расширение C (рабочий пример): https://github.com/e-g-r-ellis/ruby-giflib

Когда я собрал свое расширение Ruby C, используя nmake из Visual Studio Express мне пришлось изменить флаг компилятора из -MD в -MT во избежание зависимости от MSVCRT.

Я установил $CFLAGS переменная в моем extconf.rb файл.$CFLAGS = '-MT -Ot -Ox -W4' Не уверен, что это правильный способ изменить эти флаги, но это сработало.

https://bitbucket.org/thomthom/sketchup-ruby-c-extension/commits/3e87351be87f177b8ed43798587f6e798064492d

Другие вопросы по тегам