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

Posted

技术标签:

【中文标题】如何让 CMake 在任何地方自动添加 MagickWand 库链接【英文标题】:how to get CMake to add MagickWand library linking automatically everywhere 【发布时间】:2016-08-31 20:43:27 【问题描述】:

我想在使用 MagickWand 的软件中使用 CMake。

CMake 在我的机器上运行并生成有用的 Makefile。 在另一台机器上,我必须手动添加

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

否则链接器找不到 MagickWandGenesis() 等函数。

我通过 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、CMake 3.0.2 (Debian Jessie)。

【问题讨论】:

两台机器上的环境确实不同,或者是 FindImageMagick 模块的错误/不足。 编辑:您是否尝试通过打印查找模块设置的变量的内容来调试 FindImageMagick? 是的,我打印了所有变量(请参阅我自己的答案)并在两台机器上得到相同的输出。 【参考方案1】:

简答:ImageMagick 包有问题。

查看CMake's sources,REQUIRED 机制仅通过变量包-_FOUND 处理,独立于所需的组件。

查看包ImageMagickhere,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()

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


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

【讨论】:

But IMAGEMAGICK_FOUND is not set anywhere in the package - 变量 IMAGEMAGICK_FOUND 由先前调用 FIND_PACKAGE_HANDLE_STANDARD_ARGS 设置。实际上,这个调用同时设置了 ImageMagick_FOUNDIMAGEMAGICK_FOUND 变量,所以你提到的对 set() 的调用是多余的(但它对于向后兼容可能是有意义的)。跨度> 【参考方案2】:

想出来了,尽管输出

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 fork)套件而不是原始的 imagemagick 套件。

作为参考,使用的 aptitude search one-liner 是 aptitude search 'magick ?installed' | sort,它列出了第二台机器上的三个 graphicsmagick 包,而第一台机器上的 imagemagick 包。

【讨论】:

以上是关于如何让 CMake 在任何地方自动添加 MagickWand 库链接的主要内容,如果未能解决你的问题,请参考以下文章

定义类时自动注册(但无需在任何地方导入)

我怎样才能让我的无效公开在任何地方使用

Java SWING:随机添加一个 JTextField(从未在任何地方使用过)使屏幕变白

在任何地方使用我的 AsyncTask 类中的变量

php 通过functions.php中的钩子在任何地方添加Beaver Builder模板

WooCommerce:在任何地方添加/显示产品或变体自定义字段