我正在尝试用我自己的软件部署ImageMagick。在windows上,我刚刚在exe路径中包含了所有的核心all和编码器all,它工作得很好。但在mac os上,我遇到了程序员的麻烦。我通过macports安装了ImageMagick,并在CMake的帮助下找到了它。CMake完成了复制和修复我链接的所有核心库的所有工作。然后我复制了所有的编码库,也修复了它们,但当我启动我的应用程序时,它就是找不到任何编码器。所以我想知道我错过了什么。
注意:如果我没有修复任何路径,它可以很好地工作。只有我的部署遇到了麻烦。也许我应该包含一些配置文件?
附言:我在MacOS捆绑子文件夹中的可执行文件附近有所有的ImageMagick库,包括coders SOs。
发布于 2013-05-01 14:02:35
我已经找到了一个完整的解决方案,可以在CMake的帮助下打包部署ImageMagick。如果你不使用CMake,那么@Tomasz的答案也会有所帮助。那么让我们开始吧:
首先,当从您自己的代码中使用ImageMagick时,您需要知道它试图定位的内容和位置。要找到它,您可以使用MAGICK_DEBUG环境变量,该变量可以设置为those参数。当您调试ImageMagick时,它确实很有帮助。
前提条件:我假设您使用了FIND_PACKAGE和FIXUP_BUNDLE来查找ImageMagick并在包中设置它的二进制路径。剩下的唯一一件事就是部署编码器。另外,我假设您已经从Mac Ports安装了ImageMagick。
字符串(注册表替换"-.+“”ImageMagick_SHORT_VERSION ${ImageMagick_VERSION_STRING})
现在ImageMagick_SHORT_VERSION包含完整版本,没有任何子版本。
文件(复制/opt/local/lib/ImageMagick-${ImageMagick_SHORT_VERSION}/modules-Q16/coders/目标${PATH_TO_YOUR_BUNDLE}/Contents/MacOS/ImageMagick/coders/)
文件(GLOB IMAGEMAGICK_CODERS ${PATH_TO_YOUR_BUNDLE}/Contents/MacOS/ImageMagick/coders/*.so)
安装(SCRIPT LaScript.cmake组件运行时)
脚本内容:
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
然后,它将尝试使用MAGICK_HOME环境变量和MAGICKCORE_CODER_RELATIVE_PATH来获取模块的路径,但我们并不关心,因为我们无论如何都会在#2停止!(注意:这对于Mac Ports安装是正确的)
所以我们可以干扰搜索的唯一方法是设置MAGICK_CODER_MODULE_PATH环境变量(我们也可以编辑MAGICKCORE_CODER_PATH并用我们需要的一些静态路径替换MAGICK_CODER_MODULE_PATH,但这样做太脆弱了,而且如果有人设置了libMagickCodre也不会拯救我们)我们不应该在系统范围内设置它,因为我们可能会破坏一些用户安装,所以我们有两个选择:
我选择了后者,因为它更灵活,我有以下脚本:
#!/bin/bash
working_dir="${0%/*}"
export MAGICK_CODER_MODULE_PATH=$working_dir/ImageMagick/coders
executable="${working_dir}/ApplicationName"
"$executable"
并将CFBundleExecutable
设置为脚本的名称。
这就是全部,我希望它能帮助一些人节省时间。
发布于 2013-04-24 16:54:31
如何在捆绑包中设置MAGICK_CODER_MODULE_PATH?
查看此处:http://www.imagemagick.org/script/resources.php
编辑:
要改进信息,请:
最初,在将IM嵌入到我们自己的应用包中时,我们遇到了三个问题:
我们尝试使用install_name_tool更改dylib中的硬编码路径,但最后在执行一些测试时,将IM移动到不同的目录并进行测试
convert -debug configuration
我们发现,在运行convert之前,只需在终端控制台中至少设置并导出这三个环境变量,就可以解决上述三个问题:
DYLD_LIBRARY_PATH
MAGICK_CONFIGURE_PATH
MAGICK_CODER_MODULE_PATH
有了这个经验,我们返回到我们的捆绑包,并在一开始尝试使用Info.plist字段来设置这些变量,但似乎不起作用-可能是因为在使捆绑包内的IM路径成为相对路径时存在问题。
最后,我们创建了一个简单的sh脚本,并将其放入包中,并配置此包来运行此脚本,而不是主应用程序:
#!/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)。
正如我们的测试所得到的,以这种方式设置环境变量使得它们仅对应用程序执行上下文可见-即,当我们使用包启动应用程序时,打开终端并键入
env
输出中缺少上述三个变量。
希望这能帮助其他人省去几天的研究时间,省下几天的时间。)
发布于 2013-04-24 14:33:07
您应该遵循Mac OS X-specific Build instructions,但在configure
选项中指定--enable-shared
(有关详细信息,请参见this document )。
我猜您的应用程序找不到编解码器,因为它们已经静态链接到ImageMagick工具。这通常是为了解决可移植性问题。要使编解码器在您的应用程序中可用,您应该将它们构建为共享对象。
https://stackoverflow.com/questions/16007654
复制相似问题