如何让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 sources,REQUIRED
机制是通过变量 package-_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
到 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 包在第一台机器上。
我想在我使用 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 sources,REQUIRED
机制是通过变量 package-_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
到 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 包在第一台机器上。