如何让 CImg 库为 Qt 工作

How to get the CImg library working for Qt

我目前正在学习如何使用 Qt。我想使用 Qt 尝试一些简单的图像处理应用程序,因为我已经熟悉 CImg,所以我想使用它。我想应该可以这样做,如果不能将我的问题标记为删除或其他内容。

我的问题是:如何让 CImg 为 Qt 工作? CImg 是一个 header 文件。可以说它位于我的桌面上。我使用 Qt Creator 4.1.0 导入它,方法是使用 header 文件夹右键菜单中的 "add existing file..."。然后我的菜单看起来像这样:

.

它在我添加 #include "CImg.h" 时编译,但我无法使用它,即使我尝试输入 using namespace cimg_library 它也会告诉我 cimg_library 没有存在。我也试过只创建一个 header 文件并将 CImg.h 的内容复制到其中但是它根本无法编译并且 Qt Creator 冻结。

编辑:我设法通过将 header 位置添加到包含代码(像这样:#include "C:/Users/Marci/Desktop/CImg.h" )使情况好转一些,我现在可以 "see" 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 object)看起来像这样:

#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' 意外

我希望这足够具体。

几个月后我想通了。问题在于,CImg 使用 windows .dll 文件来实现 class cimg_display 的可视化功能。由于 Qt 是独立于平台的,所以它不喜欢这样。但是,您可以使用一个有趣的技巧使其工作。首先,您需要在项目文件中正常包含头文件。之后,无论何时你真正#include它,你都需要编写下面的宏: #define cimg_display 0 以我的理解,这使它起作用,因为 C 和 C++ 编译器只是将包含文件的内容复制到源代码中。多亏了这个宏,编译器会忽略给我们带来麻烦的 class。