Windows php上使用的libvips ffi无法找到glib函数
我正在尝试在Windows 11上使用Libvips软件包。
我已经安装了Composer软件包“ JCUPITT/VIPT”:“ 2.0.0”
我的本地PHP设置是Laragon,我已启用了FFI Extension用于php。
我已经为Windows安装了Libvips二进制文件,并将其添加到路径中。当我直接从命令行调用它时,它起作用。示例:vips invert.png output.png
运行以下文件(使用FFI):
<?php
require dirname(dirname(__DIR__)) . '/vendor/autoload.php';
use Jcupitt\Vips;
// fast thumbnail generator
$image = Vips\Image::thumbnail('example-rug.jpg', 128);
$image->writeToFile('tiny.jpg');
致命错误:未被发现的FFI \异常:失败的解决C功能 'g_malloc'in C:\ laragon \ www \ efc \ rugz \ vendor \ jcupitt \ vips \ src \ src \ config.php:773 stack 痕迹: #0 c:\ laragon \ www \ efc \ rugz \ vendor \ jcupitt \ jcupitt \ vips \ src \ src \ config..php(773):ffi :: cdef :: cdef('//我们需要...',' ') #1 C:\ laragon \ www \ efc \ rugz \ vendor \ jcupitt \ vips \ vips \ src \ src \ config..php(195):jcupitt \ vips \ vips \ config :: init() #2 C:\ laragon \ www \ efc \ rugz \ vendor \ jcupitt \ jcupitt \ vips \ src \ src \ config..php(259):jcupitt \ vips \ vips \ config :: ffi :: ffi() #3 C:\ laragon \ www \ efc \ rugz \ vendor \ jcupitt \ jcupitt \ vips \ src \ src \ src \ image.php(712):jcupitt \ vips \ vips \ config :: filenamegetfileName('.. #4 C:\ laragon \ www \ efc \ rugz \ src \ xpess \ bench.php(8):jcupitt \ vipt \ vips \ image \ image :: new fromfile('.. \ example-example-rug ....' #5 {main}
下一个ffi \异常:失败解决C函数'g_free'in C:\ laragon \ www \ efc \ rugz \ vendor \ jcupitt \ vips \ src \ src \ config.php:773 stack 痕迹: #0 c:\ laragon \ www \ efc \ rugz \ vendor \ jcupitt \ jcupitt \ vips \ src \ src \ config..php(773):ffi :: cdef :: cdef('//我们需要...',' ') #1 C:\laragon\www\efc\rugz\vendor\jcupitt\vips\src\Config.php in C:\laragon\www\efc\rugz\vendor\jcupitt\vips\src\Config.php on line 773
我只能认为这是两个GLIB功能,也许我没有Glib DLL文件?
我检查了VIP bin文件夹,并在那里找到了libglib-2.0-0.dll
。这在同一bin文件夹中,因此应在必要时在路径上找到。
我知道正在通过libvips-42.dll
将其拉入,因为如果我重命名libglib-2.0-0.dll
file,则FFI输出将变为:
致命错误:未被发现的ffi \异常:失败加载'libvips-42.dll'
我可以提供的最后一个信息是,FFI的命令的有问题部分似乎是:
void* g_malloc (size_t size);
void g_free (void* data);
I am attempting to use the libvips package on Windows 11.
I have installed the composer package "jcupitt/vips": "2.0.0"
My local PHP setup is laragon, and I have enabled the FFI extension for PHP.
I have installed libvips binary for Windows and added it to the path. It works when I call it from the command line directly. Example: vips invert input.png output.png
When running the following file (which uses FFI):
<?php
require dirname(dirname(__DIR__)) . '/vendor/autoload.php';
use Jcupitt\Vips;
// fast thumbnail generator
$image = Vips\Image::thumbnail('example-rug.jpg', 128);
$image->writeToFile('tiny.jpg');
Fatal error: Uncaught FFI\Exception: Failed resolving C function
'g_malloc' in
C:\laragon\www\efc\rugz\vendor\jcupitt\vips\src\Config.php:773 Stack
trace:
#0 C:\laragon\www\efc\rugz\vendor\jcupitt\vips\src\Config.php(773): FFI::cdef('// we need the ...', 'libvips-42.dll')
#1 C:\laragon\www\efc\rugz\vendor\jcupitt\vips\src\Config.php(195): Jcupitt\Vips\Config::init()
#2 C:\laragon\www\efc\rugz\vendor\jcupitt\vips\src\Config.php(259): Jcupitt\Vips\Config::ffi()
#3 C:\laragon\www\efc\rugz\vendor\jcupitt\vips\src\Image.php(712): Jcupitt\Vips\Config::filenameGetFilename('..\example-rug....')
#4 C:\laragon\www\efc\rugz\src\examples\bench.php(8): Jcupitt\Vips\Image::newFromFile('..\example-rug....', Array)
#5 {main}Next FFI\Exception: Failed resolving C function 'g_free' in
C:\laragon\www\efc\rugz\vendor\jcupitt\vips\src\Config.php:773 Stack
trace:
#0 C:\laragon\www\efc\rugz\vendor\jcupitt\vips\src\Config.php(773): FFI::cdef('// we need the ...', 'libvips-42.dll')
#1 C:\laragon\www\efc\rugz\vendor\jcupitt\vips\src\Config.php in C:\laragon\www\efc\rugz\vendor\jcupitt\vips\src\Config.php on line 773
All I could think is that these are 2 glib functions and maybe I do not have the glib dll file?
I checked the vips bin folder, and libglib-2.0-0.dll
is found there. This is in the same bin folder, so it should be found at the path if necessary.
I know this is being pulled in via the libvips-42.dll
, because if I rename libglib-2.0-0.dll
file, the FFI output becomes:
Fatal error: Uncaught FFI\Exception: Failed loading 'libvips-42.dll'
The last bit of info I can provide is that the offending portion of the command fed to FFI appears to be:
void* g_malloc (size_t size);
void g_free (void* data);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
猜测
libvips-42.dll
必须手动提供:https://github.com/libvips/libvips/build-win64-mxe/releases
Guess
libvips-42.dll
has to be manually provided:https://github.com/libvips/build-win64-mxe/releases
这是在v2.0.3中修复的:
https://github.com/github.com/libvips/libvips/php-php--php--php--php--php-- vips/pult/146
只需更新即可(希望)。
This is fixed in v2.0.3:
https://github.com/libvips/php-vips/pull/146
Just update and it'll work (hopefully).