littlebot
Published on 2025-04-18 / 0 Visits
0

【源码】基于C语言的跨语言调用库libffi

项目简介

libffi是一个用于解决不同编程语言间函数调用问题的库,提供了对各种调用约定的可移植、高级编程接口。对于编译时无法确定函数参数的程序(如解释器),它可作为连接解释器程序与编译后代码的桥梁。它是实现完整外部函数接口(FFI)的底层、依赖于机器的一层,上层还需处理不同语言间值的类型转换。

项目的主要特性和功能

  1. 跨平台支持:支持AArch64、Alpha、ARM、MIPS等架构,以及iOS、Linux、Windows等操作系统。
  2. 多语言调用:允许不同语言编写的代码相互调用,实现跨语言函数调用。
  3. 动态调用:程序运行时可按需调用指定函数。
  4. 功能更新:不断增加新功能支持,如RISC-V支持、GO闭包支持、IEEE754 binary128 long double支持等。

安装使用步骤

安装

  1. 配置:进入要构建libffi的目录,运行libffi源码根目录中的configure程序。若从git仓库获取源码,需先运行./autogen.sh,这要求安装autoconfautomakelibtool。构建需要C99兼容的编译器。
    • 可使用--prefix指定libffi库和头文件的安装位置,默认安装在/usr/local
    • 使用--enable-debug开启额外的运行时调试检查。
    • 使用--enable-purify-safety在使用Purify时添加额外代码以抑制某些警告,但会降低库的运行速度。
    • 使用--disable-docs不构建文档。
    • 在Windows平台使用Microsoft的Visual C++编译器时,配置时使用msvcc.sh包装脚本;64位Windows构建时,设置CC="path/to/msvcc.sh -m64"CXX="path/to/msvcc.sh -m64",可能还需适当指定--build
    • 在Windows平台使用LLVM项目的clang-cl编译器时,按相应格式配置。
    • SPARC Solaris构建需要使用GNU汇编器和链接器,配置前需设置ASLD环境变量。
    • iOS构建可使用libffi.xcodeproj Xcode项目。
  2. 编译:配置完成后,使用GNU make编译,输入make。若要验证libffi是否正常工作,输入make check,这要求安装DejaGNU。
  3. 安装:输入make install安装库和头文件。

使用

本项目提供了测试libffi库中Go闭包调用功能的代码。通过准备ffi_cif结构体、调用ffi_prep_cifffi_prep_go_closure函数来设置和准备闭包,并使用ffi_call_go函数进行闭包调用,以验证libffi库在处理Go闭包调用时的正确性和稳定性。

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】