Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos Mac OS上的ImageMagick部署_Macos_Imagemagick_Cmake - Fatal编程技术网

Macos Mac OS上的ImageMagick部署

Macos Mac OS上的ImageMagick部署,macos,imagemagick,cmake,Macos,Imagemagick,Cmake,我正在尝试用我自己的软件部署ImageMagick。在windows上,我刚刚在exe路径中包含了所有带编码器DLL的核心DLL,并且运行良好。 但在mac操作系统上,我遇到了编码员的麻烦。我通过macports安装了ImageMagick,并在CMake的帮助下找到了它。CMake负责复制和修复我链接的所有核心库。然后我复制了所有的编码库,并对它们进行了修复,但当我启动应用程序时,它就是找不到任何编码库。所以我想知道我错过了什么 注意:如果我没有修好任何路径,它工作得很好。只有我的部署遇到了麻

我正在尝试用我自己的软件部署ImageMagick。在windows上,我刚刚在exe路径中包含了所有带编码器DLL的核心DLL,并且运行良好。 但在mac操作系统上,我遇到了编码员的麻烦。我通过macports安装了ImageMagick,并在CMake的帮助下找到了它。CMake负责复制和修复我链接的所有核心库。然后我复制了所有的编码库,并对它们进行了修复,但当我启动应用程序时,它就是找不到任何编码库。所以我想知道我错过了什么

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

另外,我在MacOS bundle子文件夹中的可执行文件附近有所有ImageMagick LIB,包括编码器SOs。

您应该遵循但在
配置
选项中指定
--启用共享
(有关详细信息,请参阅)


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

在包中设置MAGICK\u CODER\u MODULE\u路径如何

请看这里:

编辑:

要改进信息:

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

  • 我们的应用程序和IM数据库找不到引用的IM数据库
  • 我找不到它的配置文件
  • IM未找到编码器(无解码委托错误)
  • 我们尝试使用install_name_工具更改dylibs中的硬编码路径,但最后在执行一些测试时,将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

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

    STRING(REGEX REPLACE "-.+" "" ImageMagick_SHORT_VERSION ${ImageMagick_VERSION_STRING})
    
    现在,ImageMagick\u SHORT\u版本包含完整版本,没有任何子版本

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

  • 现在我们需要修复所有的*.so lib,所以我们列出它并传递给fixup\u bundle

    FILE(GLOB IMAGEMAGICK_CODERS ${PATH_TO_YOUR_BUNDLE}/Contents/MacOS/ImageMagick/coders/*.so)
    
  • 现在,我们应该更新编码器附带的*.la文件*.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宏(事实上是这样的!),并使用其值
    然后它将尝试使用MAGICK_HOME环境变量和MAGICKCORE_CODER_RELATIVE_PATH获取模块的路径,但我们不在乎,因为我们无论如何都会在#2上停止!(注意:对于Mac端口安装,这是正确的)

    因此,我们干扰搜索的唯一方法是设置MAGICK\u CODER\u MODULE\u PATH环境变量(我们也可以编辑libMagickCodre,用我们需要的静态路径替换MAGICKCORE\u CODER\u路径,但这太简单了,如果有人设置MAGICK\u CODER\u模块路径,也救不了我们) 我们不应该在系统范围内设置它,因为我们可以中断一些用户安装,所以我们有两个选项:

    • 使用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我想你的应用程序找不到编解码器