Loading [MathJax]/jax/output/CommonHTML/config.js
社区首页 >问答首页 >Mac上的ImageMagick部署

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-01 06: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 08: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 06:33:07

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

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

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

https://stackoverflow.com/questions/16007654

复制
相关文章
GET请求使用@RequestBody的正确姿势
但是由于GET的参数是通过Url方式传递的,而不是请求体传递的所以无法通过@RequestBody注解来接收。
明明如月学长
2021/08/27
6.2K0
使用java实现HTTP的GET请求
在前几节我们详细讲解了http协议的相关信息,基于“知行合一”的原则,只有通过具体动手实践才有可能检验知识点被我们真正掌握,本节我们就使用代码实现http的get请求。
望月从良
2020/05/22
1.6K0
PHP简单的Curl的Get请求和Curl的Post请求和file_get_contents的Get请求获取接口JSON数据
PHP携带Cookie用Curl进行Post或Get请求获取数据 PHP全能Curl请求 /** * curl发送HTTP请求方法 * @param $url * @param string $method * @param array $params * @param array $header * @param int $timeout * @param bool|false $multi * @return mixed * @throws Exception */ function
骤雨重山
2022/01/17
2.2K0
【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )
【OkHttp】OkHttp 简介 ( OkHttp 框架特性 | Http 版本简介 ) 【OkHttp】Android 项目导入 OkHttp ( 配置依赖 | 配置 networkSecurityConfig | 配置 ViewBinding | 代码示例 ) 【OkHttp】OkHttp Get 和 Post 请求 ( 同步 Get 请求 | 异步 Get 请求 | 同步 Post 请求 | 异步 Post 请求 )
韩曙亮
2023/03/29
16.6K0
Ajax GET请求后台数据
1、前台ftl文件,通过URL请求后台数据,返回数据(Json格式)封装在data中
week
2018/08/27
1.7K0
xUtils 的 post和get 请求 使用记录
http://blog.csdn.net/lxk_1993/article/details/50897613
103style
2022/12/19
5480
GET 请求和 POST 请求的区别
① get 请求用来从服务器上获取资源;而 post 请求通常是用来向服务器提交数据的;
happyJared
2019/06/25
2.5K0
GET请求和POST请求
在网络编程中,HTTP协议是最常用的协议之一,用于在客户端和服务器之间传输数据。HTTP协议中最常用的两种请求方式是GET和POST请求。这篇博客将介绍GET和POST请求的区别,以及在不同场景中如何选择使用这两种请求方式。
chao超的搬运文章
2023/10/15
5420
-GET和POST请求添加请求参数和请求头【TBK使用】
我们平常浏览各个网站时,不免有时候就需要填写一些信息,比如注册时,登录时,这些信息一般都是通过GET请求或者POST(敏感信息一般使用POST,数据隐藏,相对来说更安全)请求提交到后台,经过后台的一系列处理,再返回给前台结果,前台进行处理。
凯哥Java
2019/06/28
6.5K0
python get请求
get请求是HTTP协议中最基本、最常见的操作。我们在浏览器中直接输入网址访问网站就是一个很常见的get请求操作。
灯珑LoGin
2022/10/31
1.2K0
GET 请求也能传递 Body 数据
通常而言, GET 请求很少传递 Body 数据, 大多情况下都是放在 url 中, 例如
老麦
2022/12/24
6.2K0
GET 请求也能传递 Body 数据
拼接GET请求的参数
本人在做接口测试的过程中,之前写了一个用字符串替换的方法来处理get接口的参数拼接,后来优化了这个方法,兼容了中文字符提示非法字符的情况,使用了java自带的urlencode方法。包括第一种方法,之前传的是json。分享代码,供大家参考。
FunTester
2019/09/25
3.9K0
HttpClient-Get请求、Post请求
有参数,请求链接为url(http://localhost:8083/getdemo2)
wangmcn
2022/07/25
2.7K0
HttpClient-Get请求、Post请求
PHP使用CURL模拟POST和GET请求
在PHP中想要构造类似GET和POST请求,在一些APP或者等后端功能开发中是有这种需求。 在PHP语言当中有file_get_content ()函数和curl的支持。 在PHP>5.3 的版本中默认两者都是开启的。
Z4
2020/04/21
2.4K0
flutter网络dio框架get请求使用总结
dio用来在flutter跨平台开发中访问网络的框架,在使用的时候,我们首先是引入依赖
早起的年轻人
2020/06/04
1.8K0
Java Web Service Get请求使用指南
在当今互联网时代,Web Service已经成为了现代软件开发中不可或缺的一部分。而Java作为一种广泛使用的编程语言,自然也提供了丰富的工具和库来支持Web Service的开发。本文将为大家介绍如何使用Java编程语言进行Web Service的Get请求。
用户10354340
2023/08/07
4620
GWT 初体验
最近体验了一下 GWT(Google Web Toolkit),其实这个技术老早就有了,写 Java 代码,代码很像 AWT 或者 Swing,但是最后编译成一个 war 包,也就是说,没有啰嗦的 JavaScript、HTML 和模板语言,Java 从前到后通吃,常用的模块都被封装成组件了。虽说写起来代码还挺啰嗦的(写法上面居然不支持链式调用,这确实让我看不懂),而且也没有传统 Web 开发方式来得直观,但也算一种很有意思的开发方式,值得体验一下。网上有足够多的教程,要系统地学习,官方文档是最好的材料,非常详尽。而我的方式,则更具个人风格一点,比较+吐槽,这可不是教程。
四火
2022/07/18
1.1K0
GWT 初体验
HttpClient 发送get请求并返回Json数据
一、以百度百科接口为例 http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&
week
2018/08/24
3.2K0
HttpClient 发送get请求并返回Json数据
点击加载更多

相似问题

如何使用Traefik+MetalLB公开Kubernetes API (apiserver)

111

Kubernetes - traefik外部ip被挂起

10

Kubernetes traefik通过特定的内部IP

10

FastAPI (starlette)获得客户端真正的IP

1124

MetalLB在Kubernetes是如何工作的

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文