簡體   English   中英

將 mkmf 與 Ruby ext 一起使用

[英]Using mkmf with Ruby ext Linking a Static Library with -L and -I and -l

給定一個簡單的gcc命令,如下所示:

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

我正在嘗試使用mkmf將其包裝在 ruby gem 擴展extconf.rb中。 目前我有:

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);
}

我想你想要的是:

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

因為文檔說:

find_library(lib, func, *paths , &b) 公共

返回是否可以在庫 lib中指定的路徑之一中找到入口點 func,其中 paths 是字符串數組。 如果 func 為 nil,則 main() function 用作入口點。

如果找到 lib,則將找到它的路徑添加到搜索和鏈接的庫路徑列表中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM