如何在 OS X 中包含 FFI?

2024-03-21

我在构建时遇到问题这个项目 https://github.com/metaeducation/ren-c启用 FFI 扩展。为了隔离问题,我正在尝试编译这个例子 http://www.chiark.greenend.org.uk/doc/libffi-dev/html/Closure-Example.html(全文包含在下面)。

我正在使用 OS X 10.13.2、Xcode 9.2 并安装了命令行工具(确认/usr/include/ffi/ffi.h存在)。我修改了示例,因此包含行读取include <ffi/ffi.h>.

在没有选项的情况下调用编译器,我得到以下结果:

$ gcc closure.test.c
closure.test.c:23:13: warning: implicit declaration of function 'ffi_closure_alloc' is invalid in C99 [-Wimplicit-function-declaration]
  closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);
            ^
closure.test.c:23:11: warning: incompatible integer to pointer conversion assigning to 'ffi_closure *' (aka 'struct ffi_closure *') from
      'int' [-Wint-conversion]
  closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);
          ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
closure.test.c:35:15: warning: implicit declaration of function 'ffi_prep_closure_loc' is invalid in C99 [-Wimplicit-function-declaration]
          if (ffi_prep_closure_loc(closure, &cif, puts_binding,
              ^
closure.test.c:45:3: warning: implicit declaration of function 'ffi_closure_free' is invalid in C99 [-Wimplicit-function-declaration]
  ffi_closure_free(closure);
  ^
4 warnings generated.
Undefined symbols for architecture x86_64:
  "_ffi_closure_alloc", referenced from:
      _main in closure-7b0e9b.o
  "_ffi_closure_free", referenced from:
      _main in closure-7b0e9b.o
  "_ffi_prep_cif", referenced from:
      _main in closure-7b0e9b.o
  "_ffi_prep_closure_loc", referenced from:
      _main in closure-7b0e9b.o
  "_ffi_type_pointer", referenced from:
      _main in closure-7b0e9b.o
  "_ffi_type_sint32", referenced from:
      _main in closure-7b0e9b.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我需要什么选项/修改来纠正这个问题?

来源closure.test.c:

#include <stdio.h>
#include <ffi.h>

/* Acts like puts with the file given at time of enclosure. */
void puts_binding(ffi_cif *cif, void *ret, void* args[],
                  void *stream)
{
  *(ffi_arg *)ret = fputs(*(char **)args[0], (FILE *)stream);
}

typedef int (*puts_t)(char *);

int main()
{
  ffi_cif cif;
  ffi_type *args[1];
  ffi_closure *closure;

  void *bound_puts;
  int rc;

  /* Allocate closure and bound_puts */
  closure = ffi_closure_alloc(sizeof(ffi_closure), &bound_puts);

  if (closure)
    {
      /* Initialize the argument info vectors */
      args[0] = &ffi_type_pointer;

      /* Initialize the cif */
      if (ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
                       &ffi_type_sint, args) == FFI_OK)
        {
          /* Initialize the closure, setting stream to stdout */
          if (ffi_prep_closure_loc(closure, &cif, puts_binding,
                                   stdout, bound_puts) == FFI_OK)
            {
              rc = ((puts_t)bound_puts)("Hello World!");
              /* rc now holds the result of the call to fputs */
            }
        }
    }

  /* Deallocate both closure, and bound_puts */
  ffi_closure_free(closure);

  return 0;
}

好吧,看来你可以这样做来修复它:

$ cd
$ git clone https://github.com/libffi/libffi
$ cd libffi/
$ ./autogen.sh
$ ./configure
$ make
$ make install

这将构建libffi从源头开始,即使你有,它也会起作用libffi安装自brew,因为这个新版本将安装在/usr/local并且不在Cellar.

那么你不需要改变#include,保持这样#include <ffi.h>,打开一个终端到您隔离的 c 源所在的文件夹并发出问题gcc -o ffi -lffi ffi.c(假设它是您拥有的源文件)。

teixeira: ~/etudes_c $ ./ffi
Hello World!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 OS X 中包含 FFI? 的相关文章

随机推荐

  • iOS 5 上的 jQuery 事件

    我在 jQuery 1 6 4 iOS 5 和 touchstart touchend 事件的注册方面遇到问题 显然 如标题中所述 采取以下代码
  • 如何判断拼图是否完成?

    我正在准备一款像拼图这样的小游戏 为此我在布局中使用了 9 个图像视图和 9 个不同的图像 在启动时将图像设置为 imageview 这些是实际图像 随机播放后用户将滑动图像以完成拼图 我想检查修改后的图像与实际图像的 天气是否相等 如果它
  • 在 WinForms 中更新 BindingSource 不会更新数据源集合

    我想在中显示自定义集合DataGridView在 Windows 窗体应用程序中 这个自定义集合实现了ICollection and IEnumerable 我已经设置了一个BindingSource 使用集合作为 DataSource 属
  • 启动时将 par 重置为默认值

    通常 当我制作自己的绘图函数时 我会制作一个构造 op lt par mypar myvalue on exit par op 这是恢复的标准方法par到之前的值 想象一下 您一直在运行一些确实更改了某些参数的函数 并且您需要在 R 中启动
  • Ruby on Rails:没有视图的操作

    我有一个我认为非常简单的问题 我有 PhP 背景 并且过去一直这样做 所以我可能以错误的方式看待这个问题 我正在尝试在 RoR 中创建一个 ajax 处理程序 当用户单击按钮时 javascript 会触发 POST 并使用 jQuery
  • 编写 django-piston 客户端的正确方法是什么?

    我已经阅读了很多关于 django piston 的文章 并使用它为我正在开发的应用程序制作 API 但我对世界的客户端很着迷 我已经编写了处理程序和 uri 映射 并且可以随心所欲地返回 JSON 或 XML 我陷入困境的是现在该怎么办
  • cygwin下无法访问jarfile

    我知道这里有很多 无法访问 jarfile 问题 但我确实觉得这足以保证它自己的线程 我正在编写一个演练 该演练的一部分涉及安装 Cygwin 并运行 jar 文件 问题是这个 jar 文件需要从多个目录调用 而不是让我的读者每次需要运行它
  • 为什么 MATLAB 中允许使用多个连续的加号语法?

    有谁知道为什么这在 MATLAB 中有效 gt gt 1 2 ans 3 来自 C Python Java 等语言的编码 我发现这根本就行得通 这是最违反直觉的 想必解析器有一些我不明白的重要内容 有一个区别plus https mathw
  • python 中的前导零[重复]

    这个问题在这里已经有答案了 Python 似乎能够接受除 08 或 09 之外的任何数字的前导零 例如 a 04 在解释器中工作但是 a 08 returns SyntaxError invalid token 我在 OSX 上使用 pyt
  • 类常量的 PHP 表达式

    我试图找出为什么我会遇到此代码的异常 class Test const test Two rows 我在包含 const 的行上遇到异常 解析错误 语法错误 意外的 期望 或 在 home BZUMUL prog php 第 X 行 我本来
  • Java 客户端/服务器套接字

    我从 java 套接字开始 并且有奇怪的 缺乏 输出 这是我的套接字方法的来源 客户端源码 public void loginToServer String host String usnm try Socket testClient ne
  • Indy 可以运行 Javascript 吗?

    有一种名为 AnyChart 的软件产品 非常适合在网页中嵌入基于 Flashed 的图表 AnyCharts 还可以导出为 PNG 文件格式 这是一个例子
  • 如何使用 sublime 在终端上运行 ruby

    我什至不确定这个问题是否正确 我正在以下链接上编写 ruby 教程 www youtube com watch v Dji9ALCgfpM 他在sublime上编写代码 并在终端上显示运行的代码 我曾经在 Integrated ruby i
  • 带选择标签的 dataTables 列过滤插件

    我正在使用数据表 v1 92 以及列过滤插件 v1 5 0 问题 我需要为单个列过滤创建下拉列表 其标记将是
  • 如何上传图片并将其保存到数据库中? [复制]

    这个问题在这里已经有答案了 我必须使用 JavaScript 创建一个表单 用户将上传一个 JPG 文件并与其他信息 例如姓名 电子邮件等 一起提交 当用户单击 提交 时 表单中的所有信息都将加载到值对象中 对于图像文件我将其设置为byte
  • 在 JavaFX 中显示字符串/标签

    我需要帮助弄清楚如何在程序中显示文本 以便它可以在我创建的多边形形状的中间显示 停止 我想做的是创建一个停车标志 我已经负责创建和显示该停止标志 所以现在我只需要在 t 中显示 停止 package application public c
  • 在 django-rest 框架中使用原始 SQL?

    我使用 Django 1 8 和带有表和物化视图的 Postgres 9 4 后端 我有一个 80GB 的表 名为spending包含支出项目 每个项目都有一个组织代码和一个区域代码 class Prescription models Mo
  • C++11 中的可变参数模板和多重继承

    我正在努力实现这样的目标 我有一个模板化基类 我想动态继承它 template
  • MSVC 的 open_memstream 的等效项

    我在用打开内存流在我的一个库中 但我想将该库移植到 MSVC 似乎没有可用的等效功能 但是有足够相似的功能吗 What 打开内存流所做的是它需要一个 char 目的地和大小并返回一个您可以写入的 FILE 数据存储在动态分配的缓冲区中 可从
  • 如何在 OS X 中包含 FFI?

    我在构建时遇到问题这个项目 https github com metaeducation ren c启用 FFI 扩展 为了隔离问题 我正在尝试编译这个例子 http www chiark greenend org uk doc libff