如何添加Qt私有模块的库?

时间:2019-07-19 07:36:48

标签: qt qt5 qtplugin

我正在尝试使用xmlpatterns-private。我可以通过添加qt += xmlpatterns-private来获取标题。但是,当我编译时会出现错误:

  

对QPatternist :: XsdSchemaResolver ::〜XsdSchemaResolver()的未定义引用

因此,这意味着找到了标头,但是lib没有安装我的Qt环境。如何在Qt中安装或添加这样的私有模块,而不是编译整个Qt源?我猜想我将拉xmlpatterns源并将其编译,并将其放入某个文件夹...换句话说,如何执行私有模块的安装。

我尝试过的事情:

  1. 下载Qt 5.13源代码
  2. 在QtCreator中打开qtxmlpatterns.pro
  3. CONFIG+=xml-schema中添加qtxmlpatterns.pro
  4. 构建
  5. 转到构建文件夹并运行mingw32-make install
  6. 重建我的项目,但出现相同的错误...

更新:

找不到该功能是因为Qt没有使用Q_XMLPATTERNS_EXPORT导出它。

因此,我将整个xmlpatterns源而不是qt += xmlpatterns-private导入我的项目。 cpp已经成为项目的一部分,为什么仍找不到该功能。

  

错误:对'_imp___ZN12QXmlNamePoolC1Ev'的未定义引用

整个项目:https://drive.google.com/drive/folders/1B2YEz1iUHdbZ-F3ukBRpjZ9eP012Jkez?usp=sharing

1 个答案:

答案 0 :(得分:0)

#ifndef Q_XMLPATTERNS_EXPORT
#  ifndef QT_STATIC
#    if defined(QT_BUILD_XMLPATTERNS_LIB)
#      define Q_XMLPATTERNS_EXPORT Q_DECL_EXPORT
#    else
#      define Q_XMLPATTERNS_EXPORT Q_DECL_IMPORT
#    endif
#  else
#    define Q_XMLPATTERNS_EXPORT
#  endif
#endif
...
#  ifdef Q_OS_WIN
#    define Q_DECL_EXPORT     __declspec(dllexport)
#    define Q_DECL_IMPORT     __declspec(dllimport)
...
  

未定义的参考   `QPatternist :: XsdSchemaResolver ::〜XsdSchemaResolver()'

这是因为XsdSchema...不是__declspec(dllexport)。 Qt有很多私有类是不可见的API。 因此,如果我用作lib,则找不到引用。 如果我用export关键字修改所有必需的类。它想解决错误。 (不确定)

我将整个源代码导入项目中,而不是使用lib。 它给出了

  

错误:对'_imp___ZN12QXmlNamePoolC1Ev'的未定义引用

因为该类具有__declspec(dllimport),所以它告诉在要导入的库中找到引用。但是现在私有类实际上是源代码的一部分(当然,我没有导入它是未定义的)。 删除__declspec(dllimport)可解决问题(已确认,构建成功)。