首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Mac上的ImageMagick部署

Mac上的ImageMagick部署
EN

Stack Overflow用户
提问于 2013-04-15 12:29:13
回答 3查看 1.5K关注 0票数 3

我正在尝试用我自己的软件部署ImageMagick。在windows上,我刚刚在exe路径中包含了所有的核心all和编码器all,它工作得很好。但在mac os上,我遇到了程序员的麻烦。我通过macports安装了ImageMagick,并在CMake的帮助下找到了它。CMake完成了复制和修复我链接的所有核心库的所有工作。然后我复制了所有的编码库,也修复了它们,但当我启动我的应用程序时,它就是找不到任何编码器。所以我想知道我错过了什么。

注意:如果我没有修复任何路径,它可以很好地工作。只有我的部署遇到了麻烦。也许我应该包含一些配置文件?

附言:我在MacOS捆绑子文件夹中的可执行文件附近有所有的ImageMagick库,包括coders SOs。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-01 14:02:35

我已经找到了一个完整的解决方案,可以在CMake的帮助下打包部署ImageMagick。如果你不使用CMake,那么@Tomasz的答案也会有所帮助。那么让我们开始吧:

首先,当从您自己的代码中使用ImageMagick时,您需要知道它试图定位的内容和位置。要找到它,您可以使用MAGICK_DEBUG环境变量,该变量可以设置为those参数。当您调试ImageMagick时,它确实很有帮助。

前提条件:我假设您使用了FIND_PACKAGE和FIXUP_BUNDLE来查找ImageMagick并在包中设置它的二进制路径。剩下的唯一一件事就是部署编码器。另外,我假设您已经从Mac Ports安装了ImageMagick。

  1. 我们需要获取ImageMagick版本字符串以正确定位编码器:

字符串(注册表替换"-.+“”ImageMagick_SHORT_VERSION ${ImageMagick_VERSION_STRING})

现在ImageMagick_SHORT_VERSION包含完整版本,没有任何子版本。

  • ,然后我们需要将所有的编码器复制到某个预定义的文件夹中(我已经使用了捆绑包的MacOS部分下的ImageMagick/coders子文件夹)

文件(复制/opt/local/lib/ImageMagick-${ImageMagick_SHORT_VERSION}/modules-Q16/coders/目标${PATH_TO_YOUR_BUNDLE}/Contents/MacOS/ImageMagick/coders/)

  • Now我们需要修复我们拥有的所有*.so库,因此我们将其列出并传递给fixup_bundle

文件(GLOB IMAGEMAGICK_CODERS ${PATH_TO_YOUR_BUNDLE}/Contents/MacOS/ImageMagick/coders/*.so)

  • Now我们应该更新*.la文件,它伴随着编码器*.so。为了实现它,我使用了脚本:

安装(SCRIPT LaScript.cmake组件运行时)

脚本内容:

代码语言:javascript
代码运行次数:0
运行
复制
SET(TARGET_BINARY_DIR "${PATH_TO_YOUR_BUNDLE}")
FILE(GLOB IMAGEMAGICK_CODERS_LA ${TARGET_BINARY_DIR}/Contents/MacOS/ImageMagick/coders/*.la)
FOREACH(file ${IMAGEMAGICK_CODERS_LA})
    FILE(READ ${file} FILE_CONTENT)
    STRING(REGEX REPLACE "dependency_libs='.*'" " " MODIFIED_FILE_CONTENT ${FILE_CONTENT})
    STRING(REGEX REPLACE "libdir='.*'" " " MODIFIED_FILE_CONTENT ${MODIFIED_FILE_CONTENT})
    FILE(WRITE ${file} ${MODIFIED_FILE_CONTENT})
ENDFOREACH()

我们几乎准备好了,剩下的唯一要做的事情就是改变我们启动应用程序的方式。但让我们稍微离题一下,看看ImageMagick在哪里搜索编码器:

宏会尝试获取MAGICK_CODER_MODULE_PATH variable

  • Then的内容,它会检查是否定义了MAGICKCORE_CODER_PATH
  • (实际上确实定义了!)并使用它的值。

然后,它将尝试使用MAGICK_HOME环境变量和MAGICKCORE_CODER_RELATIVE_PATH来获取模块的路径,但我们并不关心,因为我们无论如何都会在#2停止!(注意:这对于Mac Ports安装是正确的)

所以我们可以干扰搜索的唯一方法是设置MAGICK_CODER_MODULE_PATH环境变量(我们也可以编辑MAGICKCORE_CODER_PATH并用我们需要的一些静态路径替换MAGICK_CODER_MODULE_PATH,但这样做太脆弱了,而且如果有人设置了libMagickCodre也不会拯救我们)我们不应该在系统范围内设置它,因为我们可能会破坏一些用户安装,所以我们有两个选择:

  • 使用LSEnvironment将MAGICK_CODER_MODULE_PATH设置为某个预定义位置
  • 使用脚本启动我们的应用程序并在其中设置此变量。

我选择了后者,因为它更灵活,我有以下脚本:

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/bash
working_dir="${0%/*}"
export MAGICK_CODER_MODULE_PATH=$working_dir/ImageMagick/coders
executable="${working_dir}/ApplicationName"
"$executable"

并将CFBundleExecutable设置为脚本的名称。

这就是全部,我希望它能帮助一些人节省时间。

票数 2
EN

Stack Overflow用户

发布于 2013-04-24 16:54:31

如何在捆绑包中设置MAGICK_CODER_MODULE_PATH?

查看此处:http://www.imagemagick.org/script/resources.php

编辑:

要改进信息,请:

最初,在将IM嵌入到我们自己的应用包中时,我们遇到了三个问题:

  1. 我们的应用程序和IM dylib找不到引用的IM dylib,
  2. IM找不到其配置文件,
  3. IM找不到编码器( No Decode Delegate错误)

我们尝试使用install_name_tool更改dylib中的硬编码路径,但最后在执行一些测试时,将IM移动到不同的目录并进行测试

代码语言:javascript
代码运行次数:0
运行
复制
convert -debug configuration 

我们发现,在运行convert之前,只需在终端控制台中至少设置并导出这三个环境变量,就可以解决上述三个问题:

代码语言:javascript
代码运行次数:0
运行
复制
DYLD_LIBRARY_PATH
MAGICK_CONFIGURE_PATH
MAGICK_CODER_MODULE_PATH

有了这个经验,我们返回到我们的捆绑包,并在一开始尝试使用Info.plist字段来设置这些变量,但似乎不起作用-可能是因为在使捆绑包内的IM路径成为相对路径时存在问题。

最后,我们创建了一个简单的sh脚本,并将其放入包中,并配置此包来运行此脚本,而不是主应用程序:

代码语言:javascript
代码运行次数:0
运行
复制
#!/bin/sh
CURR_DIR="$( cd -P "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
IMAGE_MAGICK_PATH=$CURR_DIR/../Resources/ImageMagick

export DYLD_LIBRARY_PATH=$IMAGE_MAGICK_PATH/lib
export MAGICK_CONFIGURE_PATH=$IMAGE_MAGICK_PATH/lib/ImageMagick-6.8.0/config
export MAGICK_CODER_MODULE_PATH=$IMAGE_MAGICK_PATH/lib/ImageMagick-6.8.0/modules-Q16/coders

# run application
exec $CURR_DIR/OurAppName

让它正常工作的关键是正确地获取应用程序包的CURR_DIR (感谢this post)。

正如我们的测试所得到的,以这种方式设置环境变量使得它们仅对应用程序执行上下文可见-即,当我们使用包启动应用程序时,打开终端并键入

代码语言:javascript
代码运行次数:0
运行
复制
env

输出中缺少上述三个变量。

希望这能帮助其他人省去几天的研究时间,省下几天的时间。)

票数 4
EN

Stack Overflow用户

发布于 2013-04-24 14:33:07

您应该遵循Mac OS X-specific Build instructions,但在configure选项中指定--enable-shared (有关详细信息,请参见this document )。

我猜您的应用程序找不到编解码器,因为它们已经静态链接到ImageMagick工具。这通常是为了解决可移植性问题。要使编解码器在您的应用程序中可用,您应该将它们构建为共享对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16007654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档