【问题标题】:Can I use QImage in my code while I'm compiling my project as static lib (undefined reference)?将项目编译为静态库(未定义引用)时,我可以在代码中使用 QImage 吗?
【发布时间】:2018-11-13 15:23:41
【问题描述】:

我正在 Qt Creator 中开发项目,我需要在编译为静态库且没有错误的类成员函数中绘制图像,但是当我尝试使用此函数时出现以下错误:

错误:未定义引用 'QImage::QImage(int, int, QImage::Format)'

错误:未定义引用 'QImage::isNull() const'

错误:对 'QImage::fill(unsigned int)' 的未定义引用

错误:未定义引用 'QImage::setPixel(int, int, unsigned int)'

错误:未定义引用 'QImage::save(QString const&, char const*, int)

错误:未定义对 'QImage::~QImage()' 的引用

错误:未定义对 'QImage::~QImage()' 的引用

所以问题是我可以将QImage 与静态构建库一起使用吗?

在 .pro 文件中我有:

模板 = 库

CONFIG += 静态库

QT += gui

已编辑:我正在使用适用于 Android 的 GCC 4.9 编译器,如果使用适用于 Windows 的 MSVC2015 进行编译,错误如下所示:

-1: 错误: LNK2019: 无法解析的外部符号“__declspec(dllimport) public: __thiscall QImage::QImage(int,int,enum QImage::Format)” (__imp_??0QImage@@QAE@HHW4Format@0@ @Z)

-1:错误:LNK2019:未解析的外部符号“__declspec(dllimport) public: virtual __thiscall QImage::~QImage(void)”(__imp_??1QImage@@UAE@XZ)

-1:错误:LNK2019:未解析的外部符号“__declspec(dllimport) public: void __thiscall QImage::setPixel(int,int,unsigned int)”(__imp_?setPixel@QImage@@QAEXHHI@Z)

等等

【问题讨论】:

  • 您是否也将可执行文件与 Qt 的 gui lib 静态链接?
  • 不,可执行文件是动态链接的。

标签: c++ qt linker qmake qimage


【解决方案1】:

您创建的静态库未链接到 Qt。它只是一个目标文件的集合。此静态库绑定的可执行文件必须链接到 Qt - 并且 Qt 在您的情况下必须是静态构建。

【讨论】:

  • 这个项目没有自己的可执行文件,它在另一个有可执行文件的项目中使用。
  • 如果可能的话,当然也可以将库更改为动态使用 Qt
  • 因此,如果项目构建为静态库并且使用它的可执行文件动态链接 Qt,则不可能在静态库中使用 QImage 和 gui 模块中的其他内容?
  • 不,这不是不可能的。您只需要将静态库所需的所有内容链接到目标可执行文件。
  • 我独立构建静态库,目标看起来像TARGET=[project name],我在编译静态库时出错。使用该库的可执行文件是独立项目。那么如何将所有内容链接到可执行文件以成功构建静态构建?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2017-11-03
相关资源
最近更新 更多