Как заставить библиотеку CImg работать на Qt

В настоящее время я учусь использовать Qt. Я хочу попробовать несколько простых приложений для обработки изображений с использованием Qt, и, поскольку я уже знаком с CImg, я хочу использовать это. Я думаю, это должно быть возможно сделать, если не пометить мой вопрос для удаления или что-то.

Мой вопрос: как заставить CImg работать на Qt? CImg - это заголовочный файл. Допустим, он находится на моем рабочем столе. Я импортирую его, используя Qt creator 4.1.0, используя "добавить существующий файл..." в контекстном меню в папке заголовка. Тогда мое меню выглядит так:

папка моего проекта в qt,

Компилируется когда я добавляю #include "CImg.h", но я не могу использовать это, даже когда я пытаюсь напечатать using namespace cimg_library это скажет мне, что cimg_library не существует. Я также попытался просто создать заголовочный файл и скопировать в него содержимое CImg.h, но затем он просто не может скомпилироваться и Qt Creator зависает.

Изменить: мне удалось сделать ситуацию немного лучше, добавив местоположение заголовка в код включения (например, так: #include "C:/Users/Marci/Desktop/CImg.h") Теперь я могу "видеть" вещи, связанные с CImg, в среде разработчиков, и меня не будет беспокоить то, что я не найду конструктор для CImg или что-то в этом роде. Однако, когда я пытаюсь скомпилировать, используя что-либо, связанное с CImg, это даст мне около 20 ошибок компоновщика. (Код ошибки: LNK2019) Мой файл.pro выглядит так:

#-------------------------------------------------
#
# Project created by QtCreator 2016-11-08T17:08:58
#
#-------------------------------------------------

 QT       += core gui

 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

 TARGET = grayscale
 TEMPLATE = app


SOURCES += main.cpp\
         mainwindow.cpp

HEADERS  += mainwindow.h \
             C:/Users/Marci/Desktop/CImg.h

LIBS += -C:/Users/Marci/Desktop/ -CImg.h

FORMS    += mainwindow.ui

Edit2: после внесения изменений, предложенных PeterT в своем комментарии, мой.pro-файл выглядит так:

#-------------------------------------------------
#
# Project created by QtCreator 2016-11-08T17:08:58
#
#-------------------------------------------------

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = grayscale
TEMPLATE = app


SOURCES += main.cpp\
         mainwindow.cpp

HEADERS  += mainwindow.h \


INCLUDEPATH += C:/Users/Marci/Desktop

FORMS    += mainwindow.ui

И мой mainwindow.cpp (в котором я пытаюсь создать объект CImg) выглядит так:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <CImg.h>

using namespace cimg_library;


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    CImg<unsigned char> myimage(100,200);
}

MainWindow::~MainWindow()
{
    delete ui;
}

Я получаю следующие ошибки компилятора: ошибка: C2871: "cimg_library": пространство имен с таким именем не существует ошибка: C2065: "CImg": ошибка необъявленного идентификатора: C2062: тип "unsigned char" непредвиденный

Я надеюсь, что это достаточно конкретно.

1 ответ

Решение

Через несколько месяцев я понял это. Проблема заключается в том, что CImg использует файл.dll Windows для визуализации функций класса cimg_display. Поскольку Qt не зависит от платформы, это не нравится. Однако вы можете заставить его работать с интересной уловкой. Сначала вам нужно включить заголовочный файл, как обычно, в файл проекта. После этого всякий раз, когда вы на самом деле #include его, вам нужно написать следующий макрос:#define cimg_display 0В моем понимании это заставляет его работать, потому что компиляторы C и C++ просто копируют содержимое включенного файла в исходный код. А благодаря макросу компилятор будет игнорировать класс, который вызывает у нас проблемы.

Другие вопросы по тегам