Как заставить библиотеку CImg работать на Qt
В настоящее время я учусь использовать Qt. Я хочу попробовать несколько простых приложений для обработки изображений с использованием Qt, и, поскольку я уже знаком с CImg, я хочу использовать это. Я думаю, это должно быть возможно сделать, если не пометить мой вопрос для удаления или что-то.
Мой вопрос: как заставить CImg работать на Qt? CImg - это заголовочный файл. Допустим, он находится на моем рабочем столе. Я импортирую его, используя Qt creator 4.1.0, используя "добавить существующий файл..." в контекстном меню в папке заголовка. Тогда мое меню выглядит так:
Компилируется когда я добавляю #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++ просто копируют содержимое включенного файла в исходный код. А благодаря макросу компилятор будет игнорировать класс, который вызывает у нас проблемы.