【发布时间】:2016-01-10 20:26:01
【问题描述】:
我想使用 Ren-C Rebol 分支中的 FFI 功能访问动态库。我知道这可以通过启用 LibFFI 支持来构建。我需要采取哪些步骤才能启用此功能?
我主要使用 OS X 进行开发,但也希望能够构建它以用于 Linux。
【问题讨论】:
我想使用 Ren-C Rebol 分支中的 FFI 功能访问动态库。我知道这可以通过启用 LibFFI 支持来构建。我需要采取哪些步骤才能启用此功能?
我主要使用 OS X 进行开发,但也希望能够构建它以用于 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。您必须咨询您当地的 FFI-on-OSX 网站,或者可能是寻求支持联系人 Atronix Engineering),他们将 FFI 功能添加到 Rebol。)
然后有必要告诉它你的系统上哪里有 libffi。您会发现一条可能只是CLIB= -lm 的CLIB 行。例如,您可以将其更改为:
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
我主要使用 OS X 进行开发,但也希望能够构建它以用于 Linux。
在 Linux 上类似,但通常更容易获得该库,就像 sudo apt-get install libffi-dev 一样简单。 RFLAGS 和 CFLAGS 的步骤相同,它应该自动处理位置...所以您可以将 -lffi 添加到 CLIB。
【讨论】:
make 似乎有效。还不能创建例程:'此 Rebol 版本未与 libffi 功能链接'
make clean 然后make。
我的旧笔记:
cat steps-for-lib-ffi-osx
通过自制软件安装 libffi
brew 安装 libffi
在生成的makefile的-I中添加/use/include/libffi
将 /usr/local/Cellar/libffi/3.0.13/lib/libffi.a 添加到 OBJS 中 生成的makefile
3.0.13 版本可能有所不同
【讨论】: