当前位置: 首页 > news >正文

将 qt 构建为静态库

接以前的博客

之前失败了,现在成功了。
静态链接 qt 失败

配置

使用 ps1 脚本进行配置和构建

$env:CC = "clang"
$env:CXX = "clang++"$skiped_modules = @("qttools""qtdoc""qttranslations""qtlanguageserver""qtdeclarative""qtquicktimeline""qtquick3d""qtgraphs""qtlocation""qtlottie""qtmqtt""qtopcua""qtquick3dphysics""qtquickeffectmaker""qtvirtualkeyboard""qtwebengine""qtwebview"
)Invoke-Expression "../configure.bat -static -skip $($skiped_modules -join ",") -prefix ${install_path}"
if ($LASTEXITCODE)
{throw "$source_path 配置失败"
}cmake -G "Ninja" $source_path `-DCMAKE_C_COMPILER="clang" `-DCMAKE_CXX_COMPILER="clang++" `-DCMAKE_C_STANDARD=17 `-DCMAKE_CXX_STANDARD=20 `-DCMAKE_BUILD_TYPE=Release `-DCMAKE_INSTALL_PREFIX="${install_path}"if ($LASTEXITCODE)
{throw "$source_path 配置失败"
}ninja -j12
if ($LASTEXITCODE)
{throw "$source_path 编译失败"
}ninja install
  • 因为构建老是失败,所以我跳过了一些模块。
  • 构建为静态库地要点是配置时添加 -static 选项。

手动链接

静态链接 qt 时需要手动额外链接一些库,否则会链接错误。下面是我链接的库

target_link_libraries(${target_name} PUBLICsetupapizsynchronizationpcre2-16double-conversionntdllversionharfbuzzb2zstdnetapi32authzws2_32winmmuserenvdwritepngmd4cd3d12dxgid3d11wtsapi32imm32freetypeshcoredwmapid3d9shlwapiruntimeobjectuxtheme
)

此外,还要链接 qt5/plugins/platforms/libqwindows.a

Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);

最终的可执行文件项目要添加如下代码

#include "QtPlugin"Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);

这个宏展开后是:

extern ::QStaticPlugin const qt_static_plugin_QWindowsIntegrationPlugin();namespace
{struct StaticQWindowsIntegrationPluginPluginInstance{StaticQWindowsIntegrationPluginPluginInstance(){qRegisterStaticPluginFunction(qt_static_plugin_QWindowsIntegrationPlugin());}};StaticQWindowsIntegrationPluginPluginInstance staticQWindowsIntegrationPluginInstance;
} // namespace

首先声明了一个函数,然后在匿名命名空间中定义了一个 StaticQWindowsIntegrationPluginPluginInstance 类,在构造函数中会调用

qRegisterStaticPluginFunction(qt_static_plugin_QWindowsIntegrationPlugin());

然后在匿名命名空间中定义了 StaticQWindowsIntegrationPluginPluginInstance 类的对象。

也就是说任何包含了下面这段代码

#include "QtPlugin"Q_IMPORT_PLUGIN(QWindowsIntegrationPlugin);

的翻译单元都会声明一次函数,然后创建一个匿名命名空间中的 StaticQWindowsIntegrationPluginPluginInstance 类的对象,利用构造函数去注册所声明的函数。

如果多个翻译单元都包含了这段代码,就会有多个匿名命名空间中的 StaticQWindowsIntegrationPluginPluginInstance 类和它们的对象,造成不必要的代码膨胀。所以这段代码只在一个翻译单元中包含一次就够了,但是不能是在静态库的翻译单元中包含这段代码以期望能够注册 qt 模块,因为静态库中的对象的构造函数不会执行,这个匿名命名空间中的 StaticQWindowsIntegrationPluginPluginInstance 类和它的对象会被链接器丢弃。

所以,最好是在最终的可执行文件项目中的其中一个翻译单元包含一次这段代码。例如可以放在 main.cpp 中。

进行了上述操作后,就可以静态链接 qt 库了,此时已经不需要 qwindows.dll 这个动态库插件了。

http://www.dtcms.com/a/306283.html

相关文章:

  • 2025年电子设计大赛G题《电路模型探究装置》各小问数学推导及个人思路
  • 信贷风控笔记8-解读商业银行资本管理办法笔记
  • 检索排序(Re-ranking):搜索与推荐系统的精细化利器
  • MySQL 中的 Binlog 及其在删除数据库时的作用:点时间恢复(PITR)
  • Python .toml 安装文件介绍
  • 使用git提交时出现了报错,新手不会的可以参考一下。
  • 技术复盘报告:Vue表格中多行文本字段数据保存丢失问题
  • 深入浅出设计模式——创建型模式之单例模式 Singleton
  • Docker离线安装依赖包地址
  • USRP捕获手机/路由器数据传输信号波形
  • Windows环境下安装Python和PyCharm
  • 【ip】IP地址能否直接填写255?
  • 【maven】仓库配置
  • 02 基于sklearn的机械学习-特征降维(特征选择、PCA)、KNN算法、模型选择与调优(交叉验证、朴素贝叶斯算法、拉普拉斯平滑)
  • 2507C++,介绍名字对象
  • Apache Ignite 集群状态(Cluster States)
  • fortigate的waf功能
  • openwrt中br-lan,eth0,eth0.1,eth0.2
  • day08(if-esle)
  • Linux 软件包管理
  • 【机器学习】机器学习新手入门概述
  • 基于C++的智能交通和智能公交流量预测与调度优化
  • 【物联网】基于树莓派的物联网开发【18】——树莓派安装Mosquitto服务
  • 【WPS】邮件合并教程\Excel批量写入数据进Word模板
  • 【0基础PS】PS工具详解--画笔工具
  • C++ 双缓冲(Double Buffering)实现无锁读取与高效数据更新
  • InfluxDB 与 Java 框架集成:Spring Boot 实战(二)
  • 用 Python 轻松实现时间序列预测:Darts 协变量 Covariates
  • 构建工具和脚手架:从源码到dist
  • uvm tlm preface