如何让 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
处理,独立于所需的组件。
查看包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()
我猜你的第二台机器上的测试会失败。
顺便说一句,您应该只使用ImageMagick_INCLUDE_DIRS
和ImageMagick_LIBRARIES
链接到库(ImageMagick_MagickWand*
变量在这里是多余的)。如果您选择调试包,您还可以声明导入的目标。
【讨论】:
But IMAGEMAGICK_FOUND is not set anywhere in the package
- 变量 IMAGEMAGICK_FOUND 由先前调用 FIND_PACKAGE_HANDLE_STANDARD_ARGS
设置。实际上,这个调用同时设置了 ImageMagick_FOUND 和 IMAGEMAGICK_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(从未在任何地方使用过)使屏幕变白