1

MagickWand を使用するソフトウェアで CMake を使用したいと考えています。

CMake は私のマシンで動作し、便利な Makefile を生成します。別のマシンでは、手動で追加する必要があります

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lMagickWand-6.Q16 -lMagickCore-6.Q16")

そうしないと、リンカーは MagickWandGenesis() およびその他の関数を見つけることができません。

-l フラグが経由であることがわかりましたpkg-config --cflags --libs MagickWand

CMake はすでにリンカー フラグを生成するべきではありませんTARGET_LINK_LIBRARIESか?

明らかな何かを見逃しましたか、またはなぜこれがどこでも機能しないのですか?


CMakeLists.txt に次のコードがあります。

FIND_PACKAGE(ImageMagick
  REQUIRED
  COMPONENTS MagickWand
)

[...]

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16")

[...]

INCLUDE_DIRECTORIES(
  ${Boost_INCLUDE_DIR}
  ${ImageMagick_INCLUDE_DIRS}
  ${ImageMagick_MagickWand_INCLUDE_DIRS}
)

[...]

TARGET_LINK_LIBRARIES(application_name
  [...]
  ${Boost_LIBRARIES}
  ${CURL_LIBRARIES}
  ${ImageMagick_LIBRARIES}
  ${ImageMagick_MagickWand_LIBRARY}
)

その最後${ImageMagick_MagickWand_LIBRARY}は必要さえないはずです。

両方のマシンで Magick 6.8.9.9、CMake 3.0.2 を使用 (Debian Jessie)。

4

2 に答える 2

2

簡単な答え: パッケージImageMagickにバグがあります。

CMake の sourcesを見ると、このREQUIREDメカニズムは、必要なコンポーネントとは関係なく、変数 package- を介して排他的に処理され_FOUNDます。

ImageMagick ここのパッケージを見ると、ImageMagick_FOUND次のように設定されています。

set(ImageMagick_FOUND ${IMAGEMAGICK_FOUND})

ただしIMAGEMAGICK_FOUND、パッケージ内のどこにも設定されていないため、呼び出しは常に unsetになり、コンポーネントが効果的に検出されたかどうかにかかわらず、常にtrueImageMagick_FOUNDに評価されます(積極的にfalseに設定されません)。

パッケージをデバッグする (そしてプル リクエストを提案する) か、コンポーネント変数を確認することができます。

if(NOT ImageMagick_MagickWand_FOUND)
    message(FATAL_ERROR "MagickWand not found")
endif()

2台目のマシンではテストが失敗すると思います。


ちなみに、ライブラリへのリンクにはImageMagick_INCLUDE_DIRSandのみを使用する必要があります (変数はここでは冗長です)。パッケージをデバッグすることを選択した場合は、インポートされたターゲットを宣言することもできます。ImageMagick_LIBRARIESImageMagick_MagickWand*

于 2016-09-01T08:30:17.070 に答える
1

の出力にもかかわらず、それを理解しました

MESSAGE(${ImageMagick_FOUND})
MESSAGE(${ImageMagick_INCLUDE_DIRS})
MESSAGE(${ImageMagick_LIBRARIES})
MESSAGE(${ImageMagick_MagickWand_FOUND})
MESSAGE(${ImageMagick_MagickWand_INCLUDE_DIRS})
MESSAGE(${ImageMagick_MagickWand_LIBRARY})

同一ですが、インストールされているパッケージは異なります。aptitude の仮想パッケージを介して magick-dev パッケージをインストールしましたが、何らかの理由graphicsmagickで元の imagemagick スイートの代わりに一部のパッケージ (imagemagick フォーク) にスイートを使用していました。

参考までに、使用された適性検索のワンライナーはaptitude search 'magick ?installed' | sort、1 台目のマシンに imagemagick パッケージがあったのに対し、2 台目のマシンに 3 つの graphicsmagick パッケージをリストしたものでした。

于 2016-09-01T11:10:33.630 に答える