Я хочу использовать CMake в своем программном обеспечении, которое использует MagickWand.
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, REQUIRED
Механизм обрабатывается исключительно через переменную package-_FOUND
, независимо от необходимых компонентов.
Смотря в посылку ImageMagick
Вот, ImageMagick_FOUND
устанавливается следующим образом:
set(ImageMagick_FOUND ${IMAGEMAGICK_FOUND})
Но IMAGEMAGICK_FOUND
не установлен нигде в пакете, поэтому вызов всегда будет сброшен ImageMagick_FOUND
и всегда будет оцениваться правда (не активно установлен на ложный), эффективно ли найдены компоненты или нет.
Вы можете либо отладить пакет (и предложить запрос на извлечение), либо проверить переменную компонента:
if(NOT ImageMagick_MagickWand_FOUND)
message(FATAL_ERROR "MagickWand not found")
endif()
Я думаю, что тест не пройдет на вашей второй машине.
Кстати, вы должны использовать только ImageMagick_INCLUDE_DIRS
а также ImageMagick_LIBRARIES
сделать ссылку на библиотеку ( 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})
будучи идентичными, установленные пакеты отличались. Я установил пакеты magick-dev через виртуальные пакеты в aptitude, который по какой-то причине использовал graphicsmagick
пакет для некоторых пакетов (вилка imagemagick) вместо оригинального пакета imagemagick.
Для справки использовался поиск в aptitude в одну строку aptitude search 'magick ?installed' | sort
который перечислил три пакета graphicsmagick на втором компьютере, где пакеты imagemagick были на первом компьютере.