2016-08-31 3 views
1

MagickWandを使用する私のソフトウェアでCMakeを使いたいです。どのようにCMakeにMagickWandライブラリをどこにでも自動的にリンクするように追加する

CMakeは自分のマシンで動作し、便利なMakefileを生成します。別のマシンで は、私は手動でそれ以外の場合は、リンカがMagickWandGenesis()および他の機能を見つけることができません

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

を追加する必要があります。

pkg-config --cflags --libs MagickWandを介して-lフラグが見つかりました。

私はすでに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を使用すると、両方のマシン(Debian Jessie)でCMake 3.0.2を使用できます。

+0

2台のマシンの環境が異なるか、FindImageMagickモジュールのバグ/不足です。 * Edit *:FindImageMagickをデバッグしようとしましたか? –

+0

ええ、私はすべての変数を印刷しました(自分の答えを見てください)、両方のマシンで同じ出力が得られました。 – buggy3

答えて

2

短い回答:パッケージImageMagickはバグです。

CMake's sourcesを参照すると、REQUIREDメカニズムは、必要なコンポーネントとは独立して、可変パッケージ_FOUNDによって排他的に処理されます。次のように

パッケージ ImageMagick hereで探し

は、ImageMagick_FOUNDが設定されている:

set(ImageMagick_FOUND ${IMAGEMAGICK_FOUND}) 

しかしIMAGEMAGICK_FOUNDは、パッケージのいずれかの場所に設定されていないので、ImageMagick_FOUNDコールは常に設定解除され、それは常にに評価されますtrue(積極的にfalseに設定されていない)、コンポーネントが効果的に検出されるかどうか。

あなたはどちらかのパッケージをデバッグ(とプル要求を提案する)コンポーネント変数をか確認することができます。

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

は、私はテストが2番目のマシンで失敗しますね。ところで


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

+0

'IMAGEMAGICK_FOUNDはパッケージ内のどこにも設定されていません。 ' - 変数* IMAGEMAGICK_FOUND *は前の' FIND_PACKAGE_HANDLE_STANDARD_ARGS'の呼び出しによって設定されます。実際には、この呼び出しは* ImageMagick_FOUND *と* IMAGEMAGICK_FOUND *変数を設定するので、あなたが参照する 'set()'の呼び出しは還元されます(ただし、下位互換性のためには意味があります)。 – Tsyvarev

1

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

の出力が同じであるにもかかわらず、それを考え出した、インストールパッケージが異なっていました。 magick-devパッケージをaptitudeで仮想パッケージ経由でインストールしました。何らかの理由で元のimagemagickスイートの代わりにgraphicsmagickスイートをいくつかのパッケージ(imagemagick fork)に使用しました。

参考のために、使用されたaptitude search one-linerはaptitude search 'magick ?installed' | sortであり、imagemagickパッケージが最初のマシンにある2台目のマシンに3つのgraphicsmagickパッケージが記載されています。

関連する問題