c - 将 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);
}
解决方案
我想你想要的是:
find_library('quickjs', 'JS_NewRuntime', '/usr/local/lib/quickjs')
因为文档说:
find_library(lib, func, *paths , &b) 公共
返回是否可以在库 lib中指定的路径之一中找到入口点 func ,其中 paths 是字符串数组。如果 func 为 nil ,则 main() 函数用作入口点。
如果找到 lib,则将找到它的路径添加到搜索和链接的库路径列表中。
推荐阅读
- javascript - ReactJS:如何动态传递函数参数
- authentication - XMPP,Ejebberd 身份验证机制
- python - Python:拆分列表中的一个元素
- python - 将 python 代码移植到 C++ /(在 C++ 中打印出数组)
- flash - 无法使用 Flash Player 正确运行 swf 文件
- javascript - 从 Notion 页面提取 cookie
- web-deployment - GitHub 操作 SamKirkland/FTP-Deploy-Action@3.1.1 - 错误没有发布文件
- c# - 如何将一维数组复制成二维
- c# - 如何通过套接字服务器发送图像?(不是 TCPClient)
- typescript - 在 typescript 和无服务器集成测试中结合 mocha 代码覆盖率