3

独自のソフトウェアで ImageMagick を展開しようとしています。Windows では、すべてのコア dll とコーダー dll を exe パスに含めただけで、うまく機能します。しかし、Mac OS ではコーダーに問題があります。Macports 経由で ImageMagick をインストールし、CMake の助けを借りて見つけました。CMake は、私がリンクしたすべてのコア ライブラリをコピーして修正するすべての作業を行います。次に、すべてのコーダー ライブラリをコピーして修正しましたが、アプリケーションを起動するとコーダーが見つかりません。だから私はそこに何が欠けているのか知りたいです。

注:パスを修正しなければ、うまく機能します。困っているのは私の展開だけです。たぶん、ある種の設定ファイルを含める必要がありますか?

PS私は、MacOSバンドルサブフォルダーの実行可能ファイルの近くにコーダーSOを含むすべてのImageMagickライブラリを持っています。

4

3 に答える 3

4

バンドルに MAGICK_CODER_MODULE_PATH を設定するのはどうですか?

ここを参照してください: http://www.imagemagick.org/script/resources.php

編集:

情報を改善するには:

もともと IM を独自のアプリ バンドルに組み込んだとき、次の 3 つの問題がありました。

  1. 私たちのアプリと IM dylib は、参照されている IM dylib を見つけられません。
  2. IM の設定ファイルが見つかりません。
  3. IM がコーダーを見つけられない (No Decode Delegate エラー)

install_name_tool を使用して dylibs のハードコードされたパスを変更しようとしましたが、最終的に IM を別のディレクトリに移動してテストするいくつかのテストを行ったとき

convert -debug configuration 

上記の 3 つの問題はすべて、convert を実行する前にターミナル コンソールで少なくとも次の 3 つの環境変数を設定してエクスポートするだけで解決できることがわかりました。

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 を適切に取得することでした (この投稿に感謝します)。

テストの結果、環境変数をこのように設定すると、このアプリケーション実行コンテキストでのみ可視になります。つまり、バンドルを使用してアプリを起動し、ターミナルを開いて入力したときです。

env

上記の 3 つの変数が出力から欠落していました。

これが、他の人が数日間の研究と頭から髪の毛を抜くのを節約するのに役立つことを願っています;)

于 2013-04-24T08:54:31.390 に答える
2

CMake の助けを借りて ImageMagick をバンドルで展開するための完全なソリューションを見つけました。CMake を使用しない場合は、@Tomasz の回答も役立ちます。それでは始めましょう:

まず、独自のコードから ImageMagick を使用する場合、ImageMagick が何をどこで見つけようとしているのかを知る必要があります。それを見つけるには、これらのパラメーターに設定できるMAGICK_DEBUG環境変数を使用できます。ImageMagick をデバッグするときに非常に役立ちます。

前提条件: FIND_PACKAGE と FIXUP_BUNDLE を使用して ImageMagick を見つけ、そのバイナリ パスをバンドル内に設定したと仮定します。あとはコーダーを配置するだけです。また、Mac Ports から ImageMagick をインストールしたと仮定します。

  1. コーダーを正しく見つけるには、ImageMagick のバージョン文字列を取得する必要があります。

    STRING(REGEX REPLACE "-.+" "" ImageMagick_SHORT_VERSION ${ImageMagick_VERSION_STRING})
    

    ImageMagick_SHORT_VERSIONには、サブバージョンのないフル バージョンが含まれるようになりました

  2. 次に、すべてのコーダーを事前定義されたフォルダーにコピーする必要があります (バンドルの MacOS 部分の下にある ImageMagick/coders サブフォルダーを使用しました)。

    FILE(COPY /opt/local/lib/ImageMagick-${ImageMagick_SHORT_VERSION}/modules-Q16/coders/ DESTINATION ${PATH_TO_YOUR_BUNDLE}/Contents/MacOS/ImageMagick/coders/)
    
  3. 今、私たちが持っているすべての *.so ライブラリを修正する必要があるので、それをリストして fixup_bundle に渡します

    FILE(GLOB IMAGEMAGICK_CODERS ${PATH_TO_YOUR_BUNDLE}/Contents/MacOS/ImageMagick/coders/*.so)
    
  4. ここで、コーダー *.so に付随する *.la ファイルを更新する必要があります。それを達成するために、スクリプトを使用しました:

    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 がコーダーを検索する場所を調べてみましょう。

  • MAGICK_CODER_MODULE_PATH環境変数の内容を取得しようとします
  • 次に、MAGICKCORE_CODER_PATHマクロが定義されているかどうかをチェックし (実際に定義されています!)、その値を使用します。

次に、MAGICK_HOME環境変数とMAGICCORE_CODER_RELATIVE_PATHを使用してモジュールへのパスを取得しようとしますが、とにかく #2 で停止するので気にしません!(注: Mac Ports のインストールには当てはまります)

したがって、検索を妨害できる唯一の方法は、MAGICK_CODER_MODULE_PATH環境変数を設定することです (libMagickCodre を編集して、MAGICKCORE_CODER_PATHを必要な静的パスに置き換えることもできますが、それはあまりにも脆弱な方法であり、誰かが設定した場合、私たちを救うことはできませんとにかくMAGICK_CODER_MODULE_PATH)ユーザーのインストールを中断する可能性があるため、システム全体に設定しないでください。2つのオプションがあります。

  • LSEnvironment を使用して、MAGICK_CODER_MODULE_PATHを事前定義された場所に設定します。
  • スクリプトを使用してアプリを起動し、その中にこの変数を設定します。

より柔軟であるため、後者を選択しました。次のスクリプトがあります。

#!/bin/bash
working_dir="${0%/*}"
export MAGICK_CODER_MODULE_PATH=$working_dir/ImageMagick/coders
executable="${working_dir}/ApplicationName"
"$executable"

CFBundleExecutableスクリプトの名前に設定します。

以上で、誰かが時間を節約するのに役立つことを願っています。

于 2013-05-01T06:02:34.540 に答える
1

Mac OS X 固有のビルド手順に従います--enable-sharedが、オプションで指定する必要がありconfigureます (詳細については、このドキュメントを参照してください)。

コーデックは ImageMagick ツールに静的にリンクされているため、アプリケーションがコーデックを見つけることができないと思います。これは通常、移植性の問題に対処するために行われます。アプリケーションでコーデックを使用できるようにするには、コーデックを共有オブジェクトとして構築する必要があります。

于 2013-04-24T06:33:06.500 に答える