如何让 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。
我目前正在学习如何使用 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。