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 的源代码,该REQUIRED机制仅通过变量 package- 处理_FOUND,独立于所需的组件。

ImageMagick 看这里的包,ImageMagick_FOUND设置如下:

set(ImageMagick_FOUND ${IMAGEMAGICK_FOUND})

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

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

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

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


顺便说一句,您应该只使用ImageMagick_INCLUDE_DIRSImageMagick_LIBRARIES链接到库(ImageMagick_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 fork)而不是原始的 imagemagick 套件。

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

于 2016-09-01T11:10:33.630 回答