<2022-04-11 Mon>
关于ImageMagick的*_utf8系列函数
从ImageMagick
中拷贝过来的open_utf8()
,fopen_utf8()
,stat_utf8()
及remove_utf8()
函数直接用非_utf8
的函数代替。ImageMagick
在windows
下使用的是宽字符,所以有那样的处理。且可能遇到linux
和windows
的文件名合法性问题,utf8
的处理是必不可少的,但目前不需要。
关于lt_dlclose()函数
之前将lt_dlclose()
函数改成了dlclose()
函数,真是多此一举。因为在windows
下lt_dlclose()
是一个宏,它最终调用FreeLibrary()
。
// ImageMagick/MagickCore/nt-base.h
#if !defined(lt_dlclose)
# define lt_dlclose(handle) NTCloseLibrary(handle)
#endif
// ImageMagick/MagickCore/nt-base.c
MagickPrivate int NTCloseLibrary(void *handle)
{
return(!(FreeLibrary((HINSTANCE) handle)));
}
在linux
下使用lt_dlclose()
需要添加-lltdl
链接选项,发现在ImageMagick
中只要使用了--enable-opencl
后运行./configure
就自动添加上了-lltdl
,所以我想在GraphicsMagick
中也要实现它。
<2022-04-12 Tue>
关于-lltdl链接选项(一)
我一直在尝试--enable-opencl
时自动添加上-lltdl
链接选项。我参考了ImageMagick
中的configure.ac
中的实现,修改后GraphicsMagick
的configure.ac
的片断:
#
# Optionally check for libltdl if using it is still enabled
#
# Only use/depend on libtdl if we are building modules. This is a
# change from previous releases (prior to 1.3.17) which supported
# loaded modules via libtdl if shared libraries were built. of
# whether modules are built or not.
have_ltdl='no'
LIB_LTDL=''
if test "$build_modules" != 'no' || test "X$no_cl" != 'Xyes'
then
AC_MSG_CHECKING([for libltdl ])
AC_MSG_RESULT()
failed=0
passed=0
AC_CHECK_HEADER([ltdl.h],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`])
AC_CHECK_LIB([ltdl],[lt_dlinit],[passed=`expr $passed + 1`],[failed=`expr $failed + 1`],)
AC_MSG_CHECKING([if libltdl package is complete])
if test $passed -gt 0
then
if test $failed -gt 0
then
AC_MSG_RESULT([no -- some components failed test])
have_ltdl='no (failed tests)'
else
LIB_LTDL='-lltdl'
LIBS="$LIB_LTDL $LIBS"
AC_DEFINE(HasLTDL,1,[Define if using libltdl to support dynamically loadable modules])
AC_MSG_RESULT([yes])
have_ltdl='yes'
fi
else
AC_MSG_RESULT([no])
fi
if test "$have_ltdl" != 'yes'
then
AC_MSG_FAILURE([libltdl is required by modules and OpenCL builds],[1])
fi
fi
AM_CONDITIONAL(WITH_LTDL, test "$have_ltdl" != 'no')
然后在设置MAGICK_DEP_LIBS
值的if
和else
分支中保证都含有$LIB_LTDL
,同时注意no_cl
的变量位置问题,否则上面代码段的no_cl
值为空,导致上面代码段中的if
分支始终能进入。
虽然经过这样的处理可以实现当使用--enable-opencl
时自动加上-lltdl
链接选项,但是引出了一个新的问题,当运行gm
时:
[ysouyno@arch gm-ocl]$ gm display ~/temp/bg1a.jpg
gm display: No decode delegate for this image format (/home/ysouyno/temp/bg1a.jpg).
gm display: Unable to open file (Untitled) [No such file or directory].
[ysouyno@arch gm-ocl]$
经过调查发现,这是由于HasLTDL
宏被启用的缘故。
关于-lltdl链接选项(二)
这里发现另外一个问题,在ImageMagick
中也存在这个问题。
虚拟机环境中,有存在cl.h
头文件,但没有libOpenCL.so
的情况,这种情况下安装各种intel
或者mesa
的runtime
均不能配置成功可运行的opencl
的环境(可以从clinfo
的运行结果来看),这样的话,按“关于-lltdl
链接选项(一)”的修改使用--enable-opencl
选项编译GraphicsMagick
和ImageMagick
的话,均编译失败:
undefined reference to `lt_dlclose'
因为如果有cl.h
头文件的话,那么HAVE_CL_CL_H
宏将启用,则HAVE_OPENCL
宏也被启用,这样的话lt_dlclose()
就可见了,但是没有opencl
的链接环境,导致no_cl
变量为yes
,则-lltdl
被忽略,从而链接失败,出现上述问题。
#if defined(HAVE_CL_CL_H)
# include <CL/cl.h>
# define HAVE_OPENCL 1
#endif
#if defined(HAVE_OPENCL_CL_H)
# include <OpenCL/cl.h>
# define HAVE_OPENCL 1
#endif
阅读了一下GraphicsMagick
的configure.ac
中关于build_modules
的代码,了解到要在原生的GraphicsMagick
中启用-lltdl
,需要使用如下命令:
$ ./configure --enable-shared --with-modules
这样在lib/GraphicsMagick-1.3.35/module-Q8/coders
目录中生成大量的.la
文件。
我在想,我的要求只是简单的在--enable-opencl
时添加一个链接选项,有必要大动干戈的修改原GraphicsMagick
的libltdl
的编译逻辑吗?我可以在configure.ac
中额外处理no_cl
,而不去启用HasLTDL
宏?这样处理好不好?
<2022-04-13 Wed>
关于-lltdl链接选项(三)
赶紧结束吧,这个链接选项不能搞两天呀!既然ImageMagick
也有同样的问题,那么就不考虑上面所说的,存在cl.h
头文件,但没有libOpenCL.so
的情况,造成链接失败。比如出现如下提示:
undefined reference to symbol 'dlsym@@GLIBC_2.2.5'
其它的测试看起来一切正常。
另因为lt_dlclose()
也适用于windows
平台,因此得尽快支持该平台,此平台还有好多开发,宏调整等等,得尽快完善起来。文章来源:https://www.toymoban.com/news/detail-820639.html
见commit
:add ‘-lltdl’ if opencl enabled。文章来源地址https://www.toymoban.com/news/detail-820639.html
到了这里,关于GraphicsMagick 的 OpenCL 开发记录(二十)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!