Macos Mac OS上的ImageMagick部署
我正在尝试用我自己的软件部署ImageMagick。在windows上,我刚刚在exe路径中包含了所有带编码器DLL的核心DLL,并且运行良好。 但在mac操作系统上,我遇到了编码员的麻烦。我通过macports安装了ImageMagick,并在CMake的帮助下找到了它。CMake负责复制和修复我链接的所有核心库。然后我复制了所有的编码库,并对它们进行了修复,但当我启动应用程序时,它就是找不到任何编码库。所以我想知道我错过了什么 注意:如果我没有修好任何路径,它工作得很好。只有我的部署遇到了麻烦。也许我应该包括一些配置文件 另外,我在MacOS bundle子文件夹中的可执行文件附近有所有ImageMagick LIB,包括编码器SOs。您应该遵循但在Macos Mac OS上的ImageMagick部署,macos,imagemagick,cmake,Macos,Imagemagick,Cmake,我正在尝试用我自己的软件部署ImageMagick。在windows上,我刚刚在exe路径中包含了所有带编码器DLL的核心DLL,并且运行良好。 但在mac操作系统上,我遇到了编码员的麻烦。我通过macports安装了ImageMagick,并在CMake的帮助下找到了它。CMake负责复制和修复我链接的所有核心库。然后我复制了所有的编码库,并对它们进行了修复,但当我启动应用程序时,它就是找不到任何编码库。所以我想知道我错过了什么 注意:如果我没有修好任何路径,它工作得很好。只有我的部署遇到了麻
配置
选项中指定--启用共享
(有关详细信息,请参阅)
我猜您的应用程序找不到编解码器,因为它们已静态链接到ImageMagick工具。这通常是为了解决可移植性问题。要使编解码器在应用程序中可用,您应该将其构建为共享对象。在包中设置MAGICK\u CODER\u MODULE\u路径如何 请看这里: 编辑: 要改进信息: 最初,在将IM嵌入我们自己的应用程序包时,我们遇到了三个问题:
convert -debug configuration
我们发现,在运行convert之前,只需在终端控制台中设置并导出至少这三个环境变量,就可以解决上述三个问题:
DYLD_LIBRARY_PATH
MAGICK_CONFIGURE_PATH
MAGICK_CODER_MODULE_PATH
有了这个经验,我们回到了我们的捆绑包,并在开始时尝试使用Info.plist fiel来设置这些变量,但它似乎不起作用-可能是因为在捆绑包中使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(多亏了)
从我们的测试中可以看出,通过这种方式设置环境变量,它们只在这个应用程序执行上下文中可见,也就是说,当我们使用bundle启动应用程序时,打开终端并键入
env
输出中缺少上述三个变量
希望这能帮助其他人省下几天的研究时间,省去他们的烦恼;) 我找到了一个完整的解决方案,可以在CMake的帮助下捆绑部署ImageMagick。如果你不使用CMake,那么@Tomasz的答案也会有所帮助。 让我们开始: 首先,您需要知道ImageMagick在您自己的代码中使用时试图定位的内容和位置。要找到它,您可以使用MAGICK_DEBUG环境变量,该变量可以设置为参数。当您调试ImageMagick时,它确实很有帮助 先决条件: 我假设您使用FIND_PACKAGE和FIXUP_BUNDLE来查找ImageMagick并在BUNDLE中设置其二进制路径。唯一剩下的就是部署编码器。我还假设您已经从Mac端口安装了ImageMagick
STRING(REGEX REPLACE "-.+" "" ImageMagick_SHORT_VERSION ${ImageMagick_VERSION_STRING})
现在,ImageMagick\u SHORT\u版本包含完整版本,没有任何子版本FILE(GLOB IMAGEMAGICK_CODERS ${PATH_TO_YOUR_BUNDLE}/Contents/MacOS/ImageMagick/coders/*.so)
INSTALL(SCRIPT LaScript.cmake COMPONENT Runtime)
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在哪里搜索编码器:
STRING(REGEX REPLACE "-.+" "" ImageMagick_SHORT_VERSION ${ImageMagick_VERSION_STRING})
- 它尝试获取MAGICK\u CODER\u MODULE\u PATH环境变量的内容
- 然后它检查是否定义了MAGICKCORE\u CODER\u PATH宏(事实上是这样的!),并使用其值
- 使用LSEnvironment将MAGICK_CODER_MODULE_路径设置到某个预定义位置
- 使用脚本启动我们的应用程序并在其中设置此变量
#!/bin/bash
working_dir="${0%/*}"
export MAGICK_CODER_MODULE_PATH=$working_dir/ImageMagick/coders
executable="${working_dir}/ApplicationName"
"$executable"
并将CFBundleExecutable
设置为脚本的名称
仅此而已,我希望它能帮助某人节省时间。你检查过了吗?@Alvin,在这种情况下没有什么帮助。虽然你的答案很有价值,但它回答了完全不同的问题。我没有问“如何在MAC OS下构建ImageMagick”@ixSci我想你的应用程序找不到编解码器