如何让CMake在任何地方自动添加MagickWand库链接

how to get CMake to add MagickWand library linking automatically everywhere

我想在我使用 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)。

简答:包 ImageMagick 有问题。

查看 CMake's sourcesREQUIRED 机制是通过变量 package-_FOUND 专门处理的,独立于所需的组件。

查看包ImageMagickhereImageMagick_FOUND设置如下:

set(ImageMagick_FOUND ${IMAGEMAGICK_FOUND})

但是 IMAGEMAGICK_FOUND 没有在包的任何地方设置,所以调用总是会取消设置 ImageMagick_FOUND,并且它总是被评估为 true (未主动设置为 false),无论组件是否有效找到。

您可以调试包(并提出拉取请求)或检查组件变量:

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

我猜你的第二台机器上的测试会失败。


顺便说一句,你应该只使用 ImageMagick_INCLUDE_DIRSImageMagick_LIBRARIES 到 link 到库(ImageMagick_MagickWand* 变量在这里是多余的)。如果您选择调试包,您还可以声明导入的目标。

想通了,尽管

的输出
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 one-liner 是 aptitude search 'magick ?installed' | sort,它在第二台机器上列出了三个 graphicsmagick 包,而 imagemagick 包在第一台机器上。