как заставить CMake автоматически добавлять ссылки на библиотеки MagickWand везде

Я хочу использовать 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).

1

Решение

Краткий ответ: пакет 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* переменные здесь избыточны). Если вы решите отладить пакет, вы также можете объявить импортированные цели.

2

Другие решения

Разобрался, несмотря на выход

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 были на первом компьютере.

1

По вопросам рекламы [email protected]