我想使用Ren-C Rebol分支中的FFI功能访问一个动态库。我知道,通过启用LibFFI支持进行构建,这是可能的。我需要采取哪些步骤才能实现这一点?
我主要使用OSX进行开发,但也希望能够将其构建为与Linux一起使用。
(注意:这可能是应该添加到Wiki中的信息,因为这与其说是一个语言问题,不如说是一种随着时间的推移而变化的事情。但是,可以回答,所以…)
如果您使用GNU make方法进行构建(其中make -f makefile.boot
为您生成一个makefile),那么您应该在其中找到一些行,如:
TO_OS_BASE?= TO_OSX
TO_OS_NAME?= TO_OSX_X64
OS_ID?= 0.2.40
BIN_SUFFIX=
RAPI_FLAGS= -D__LP64__ -DENDIAN_LITTLE -DHAS_LL_CONSTS -O1 ...
HOST_FLAGS= -DREB_EXE -D__LP64__ -DENDIAN_LITTLE ...
修改开头的RAPI_FLAGS和HOST_FLAGS行以添加-DHAVE_LIBFFI_AVAILABLE
。这个(-D)定义了一个预处理器指令,告诉代码可以生成对FFI的调用,因为以后可以链接它。
现在告诉它在哪里可以找到包含文件。包含的行应该看起来像:
INCL ?= .
I= -I$(INCL) -I$S/include/ -I$S/codecs/ ...
在它的尾部,你需要添加一些看起来像-I/usr/local/opt/libffi/lib/libffi-3.0.13/include
或类似的东西。实际的目录将取决于您的系统中有libffi的位置。在我正在查看的OSX系统上,它有两个文件,ffi.h
和ffitarget.h
。
(注意:恐怕我不知道这些文件是如何在这台计算机上出现的。它们没有随操作系统一起提供,所以它们来自……某个地方。我通常不在OSX上开发,也不使用这个FFI。你必须在OSX网站上咨询你当地的FFI,或者联系Atronix Engineering寻求支持,后者为Rebol添加了FFI功能。)
然后有必要告诉它您的系统中有libffi的位置。您会发现一个CLIB行,它可能只是CLIB= -lm
。例如,您可以将其更改为:
CLIB= -L/usr/local/opt/libffi/lib -lm -lffi
-lffi
告诉它查找ffi(-l)库,-lxxx表示它假定库的名称为libxxx[something]
。-L/usr/local/opt/libffi/lib
告诉它在哪里寻找它。你必须弄清楚你在哪里(如果在任何地方)有libffi,如果没有得到它。如果你有,目录会有类似的内容:
libffi-3.0.13
libffi.6.dylib
libffi.a
libffi.dylib
pkgconfig
我主要使用OSX进行开发,但也希望能够将其构建为与Linux一起使用。
在Linux上,这是类似的,但通常更容易获得库,就像sudo apt-get install libffi-dev
一样容易。RFLAGS和CFLAGS的步骤相同,它应该自动处理位置。。。因此您可以仅将-lffi
添加到CLIB。
我的旧笔记:
lib-fi-osx-的cat步骤
通过自制安装libfffi
brew安装libffi
在生成的生成文件中将/use/include/libfi添加到-I
将/usr/local/Cellar/libfi/3.0.13/lib/libffi.a添加到生成的生成文件
3.0.13版本的可能有所不同