Использование mkmf с Ruby ext Связывание статической библиотеки с помощью -L, -I и -l

Учитывая простой gcc команда, которая выглядит следующим образом:

gcc quickrb.c -o main -L /usr/local/lib/quickjs -I /usr/local/lib/quickjs -l quickjs

Я пытаюсь обернуть это внутри расширения рубинового драгоценного камня extconf.rb с помощью mkmf. На данный момент у меня есть:

require 'mkmf'

dir_config('quickjs', '/usr/local/lib/quickjs', '/usr/local/include/quickjs')

abort('missing "quickjs.h"') unless find_header('quickjs/quickjs.h')
abort('missing JS_NewRuntime') unless find_library('quickjs', 'JS_NewRuntime', 'quickjs/quickjs.h')
abort('missing JS_NewContext') unless find_library('quickjs', 'JS_NewContext', 'quickjs/quickjs.h')

create_makefile('quickrb/quickrb')

Это не работает с:

checking for quickjs/quickjs.h... yes
checking for JS_NewRuntime() in -lquickjs... no
missing JS_NewRuntime

Я не знаю, как обрабатывать. Безfind_library вызывает Makefile, но он не работает при компиляции с помощью:

dyld: Symbol not found: _JS_NewRuntime

Примечание:

Вот мой образец quickrb.c файл:

#include <quickjs/quickjs.h>

#include <ruby.h>

#include <stdio.h>
#include <strings.h>

void Init_quickrb()
{
  const char *filename = "runtime";
  const char *script = "3 + 4";
  const size_t length = strlen(script);

  JSRuntime *runtime = JS_NewRuntime();
  JSContext *context = JS_NewContext(runtime);

  JSValue value = JS_Eval(context, script, length, filename, JS_EVAL_TYPE_GLOBAL);

  const char *result = JS_ToCString(context, value);
  printf("%s = %s\n", script, result);
  JS_FreeCString(context, result);

  JS_FreeContext(context);
  JS_FreeRuntime(runtime);
}

1 ответ

Решение

Я думаю, что вам нужно:

find_library('quickjs', 'JS_NewRuntime', '/usr/local/lib/quickjs')

Потому что в документации сказано:

find_library(lib, func, *paths, &b) общедоступный

Возвращает, можно ли найти функцию точки входа в библиотеке lib по одному из указанных путей, где paths - это массив строк. Если func равен nil, то в качестве точки входа используется функция main().

Если библиотека найдена, то путь, по которому она была найдена, добавляется в список библиотечных путей, с которыми был произведен поиск и с которой была сделана ссылка.

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