2016-09-08 6 views
1

Я программирую на C. Я хочу использовать библиотеку ImageMagick, но некоторые fuction не могут быть решены.ImageMagic library with Cmake: ошибка связывания

Это мой cMakeList.txt файл:

cmake_minimum_required(VERSION 3.3) 
project(WebServer) 

set(CMAKE_C_COMPILER "/usr/bin/gcc") 

set(SOURCE_FILES io.c server.c lock_fcntl.c sig_handler.c thread_job.c msg_parser.c) 
set(LIB http-parser-master/http_parser.c) 

set(CMAKE_USE_PTHREADS_INIT true) 
set(CMAKE_USE_PTHREADS_INIT ON) 

find_package(Threads REQUIRED) 
find_package(ImageMagick COMPONENTS ImageWand) 

include_directories(header) 
include_directories(http-parser-master) 

#include_directories(/usr/local/include/ImageMagick-7/MagickWand) 
include_directories(${ImageMagick_INCLUDE_DIRS}) 

add_executable(server ${SOURCE_FILES} ${LIB}) 
add_executable(client client.c io.c) 
add_executable(main main.c io.c) 

target_link_libraries(main ${ImageMagick_LIBRARIES}) 
target_link_libraries(server Threads::Threads) 

и это является источником main.c:

#include <ImageMagick-7/MagickWand/MagickWand.h> 
#include "basic.h" 

void convert_image(char *path, float quality_factor, char *out) { 

    int width, height; 
    MagickWand *n_wand = NULL; 

    MagickWandGenesis(); 

    m_wand = (struct MagickWand *) NewMagickWand(); 


    MagickReadImage(m_wand,"logo:"); 

    width = MagickGetImageWidth(m_wand); 
    height = MagickGetImageHeight(m_wand); 

    if((width /= 2) < 1)width = 1; 
    if((height /= 2) < 1)height = 1; 

    MagickResizeImage(m_wand,width,height,LanczosFilter,1); 

    MagickSetImageCompressionQuality(m_wand,95); 

    MagickWriteImage(m_wand,"logo_resize.jpg"); 

    if(m_wand)m_wand = (struct MagickWand *) DestroyMagickWand(m_wand); 

    MagickWandTerminus(); 
} 

На сборке я получаю эту ошибку:

Scanning dependencies of target main 
[ 33%] Building C object CMakeFiles/main.dir/main.c.o 
[ 66%] Linking C executable main 
CMakeFiles/main.dir/main.c.o: nella funzione "convert_image": 
/home/emanuele/ClionProjects/WebServer/main.c:14: riferimento non definito a "MagickWandGenesis" 
/home/emanuele/ClionProjects/WebServer/main.c:16: riferimento non  definito a "NewMagickWand" 
/home/emanuele/ClionProjects/WebServer/main.c:19: riferimento non definito a "MagickReadImage" 
/home/emanuele/ClionProjects/WebServer/main.c:22: riferimento non definito a "MagickSetImageCompressionQuality" 
/home/emanuele/ClionProjects/WebServer/main.c:25: riferimento non definito a "MagickWriteImage" 
/home/emanuele/ClionProjects/WebServer/main.c:28: riferimento non definito a "DestroyMagickWand" 
/home/emanuele/ClionProjects/WebServer/main.c:30: riferimento non definito a "MagickWandTerminus" 
collect2: error: ld returned 1 exit status 
make[3]: *** [main] Errore 1 
make[2]: *** [CMakeFiles/main.dir/all] Errore 2 
make[1]: *** [CMakeFiles/main.dir/rule] Errore 2 
make: *** [main] Errore 2 

ImageMagick правильно установлен и работает по командной строке. Как решить?

+0

вы должны проверить в cmake, если ваша библиотека найдена или нет. Вы проверили значение 'ImageMagick_LIBRARIES'? Возможно, вам также нужно установить путь к библиотеке. – Hayt

+0

, если я добавлю 'find_package (ImageMagick COMPONENTS MagickWand REQUIRED)' I get' Ошибка: не удалось найти ImageMagick (отсутствует: ImageMagick_MagickWand_LIBRARY) (найденная версия «7.0.3-0») ', но я не знаю, как исправить –

+0

Вот почему вы получаете ошибки компоновщика. Поскольку ваш '$ {ImageMagick_LIBRARIES}' пуст после этого. если в вашей библиотеке нет пути по умолчанию, вы можете добавить дополнительные пользовательские пути в find_package, чтобы добавить папку, в которой находится библиотека. – Hayt

ответ

0

В вашем случае вы получаете ошибки компоновщика, потому что find_package не может найти конфигурацию для библиотеки.

find_package ищет файл в формате <name>Config.cmake или <lower-case-name>-config.cmake, который установит необходимые переменные.

Не каждая библиотека имеет эти файлы и когда не нужно вручную указать имя библиотеки в target_link_library (...) и других конфигураций (например, путь к библиотеке и включают в себя путь и т.д., если это необходимо)

Смежные вопросы