cmake构建32位应用程序
1. 背景介绍
最近需要使用第三方动态库文件G33DDCAPI.dll进行二次开发。由于这个动态库文件生成的时间比较早,且只提供了32位的版本,并没有提供源代码。如果希望利用这个动态库进行开发,有两种解决方法:
- 编译64位应用程序,但需要在64位程序中链接32位动态库;
- 将整个程序编译为32位应用程序。
方法1需要创建独立的线程,对动态库进行调用,并使用某种形式的IPC在64位应用程序和辅助进程之间传递这些调用。实际处理起来会很麻烦。
方法2需要搭建32位的编译环境(使用32位编译器,其他32位库etc)。在环境搭好后,不需要在程序中进行额外的处理,以下采用第二种方法。
开发环境配置如下:
操作系统:win11
编译器:mingw-w64
编译工具:cmake
IDE:CLion 2021
2. 工具介绍
首先介绍一下用到的工具,熟悉工具的大佬自行跳过。
1)编译器mingw-w64。源程序文件(源码)需要经过编译(包括预处理、编译、汇编、链接四个过程),才能生成可执行文件,这个过程需要用到编译器。mingw-w64是编译器gcc的 windows版本。注意mingw和mingw-w64并不相同,一般推荐使用mingw-w64,具体有哪些区别参考MinGW-w64安装教程。
2)编译自动化工具cmake。cmake是一款开源、跨平台编译自动化工具,支持多种语言和平台。为什么要使用cmake呢?如果直接使用编译器对源程序进行编译处理,需要手动执行各种命令(如gcc,mingw32等),当源文件较多时,这个过程会非常复杂和繁琐。因此,开发人员开发了各种buildsystem(构建系统),告诉计算机如何使用编译工具,自动完成从source code到可执行文件或库文件的编译过程,即编译自动化。这些buildsystem种类繁多,包括makefile,某个IDE的项目文件,如vs的vcxproj文件等等。为了避免学习和维护多个这样的buildsystem,项目可以使用cmake语言编写的文件(CMakeLists.txt)抽象地指定其构建系统。利用这些文件,cmake可以为每个用户本地生成一个需要的buildsystem。综上所述,cmake根据CMakeLists.txt生成一个buildsystem,再由这个buildsystem指导编译器,完成源文件的编译过程,生成可执行文件或库文件。具体过程如下图所示。具体教程和帮助文档参考CMake官网。

3)集成开发环境CLion。由于开发过程中用到的工具比较多,手动执行的过程也比较繁琐,借助IDE将这些工具集成到一起,方便配置和使用,并且借助IDE提供的其他功能,能够极大提高开发和调试的效率。CLion是JetBrain旗下的一款跨平台C/C++开发IDE,直接官网下载,激活/破解的具体方法参考CLion安装教程。
3. 环境搭建
下面介绍如何在CLion中搭建32位的编译和调试环境。
- 步骤1,在File->Setting->Build,Execution,Deployment->CMake中进行如下设置:

这里是对CMake命令的参数进行设置,每一行设置的具体含义,可以参考CLion的帮助文档(设置界面左下角“帮助”图标)
- 步骤2,同样在Setting界面,点击Toolchains,对编译调试过程中用到的所有工具,进行设置:

值得注意的是,CMake和Debugger直接使用CLion自带的就行,而编译工具集Toolset不能使用CLion自带的mingw-w64,其自带的mingw-w64只提供了编译64位应用程序的版本,而为了链接32位动态库,必须使用32位编译工具集,这非常重要,否则项目在编译阶段会报错!!!关于编译器版本识别参考下一节MinGW编译器版本。
- 步骤3,创建CMakeLists.txt,使用
target_link_directories(tst PUBLIC ${PROJECT_SOURCE_DIR})
target_link_libraries(tst G33DDCAPI.dll)
告诉编译器,可执行文件tst需要链接库文件G33DDCAPI.dll,和库文件所在目录。
- 步骤4,点击load cmake project按钮,执行cmake命令,生成对应的buildsystem。最后,点击运行,即可成功运行。

4. MinGW编译器版本
这里多说一点,mingw编译器可以分为三种类型,Windows平台下安装mingw编译器后,在对应bin目录下,执行gcc -v命令可以看到自己到底是安装的那种编译器:
mingw32-gcc.exe 编译器将在32位系统上构建32位应用程序。由于MinGW项目已经很久没有更新了,且只能编译32位程序,不推荐安装。执行gcc -v后,可以看到Target显示为mingw32,这表示你安装的编译器是老旧的MinGW版本。

i686-w64-mingw32-gcc.exe 编译器将在64位系统上构建32位应用程序。该编译器属于MinGW-w64项目,用于编译32位应用程序,这也是本项目需要的编译器。执行gcc -v后,可以看到Target显示为i686-w64-mingw32。

x86_64-w64-mingw32-gcc.exe 编译器将在64位系统上构建64位应用程序。该编译器属于MinGW-w64项目,用于编译64位应用程序,执行gcc -v后,可以看到Target显示为x86_64-w64-mingw32。

更多关于MinGW编译器相关信息参考MinGW编译器版本。
下一篇文章讲解,在cmake中如何利用Qt库进行32位程序的开发。
cmake构建32位应用程序的更多相关文章
- 64位系统运行32位Oracle程序解决方案
Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when ...
- 关于oracle 11g 64位与 32位的 plsql、及其他32位应用程序共存的问题
因为 plsql 不支持 64位 oracle 客户端,所以plsql 必须使用 oracle 的 32位 instanclient 包. 解压缩后放一个目录,例如: D:\Oracle\insta ...
- 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序。
原文 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序. win7 64位操作系统上边运行IIS网站应用的时候,提示错误"试图加载格式 ...
- 解决windows server2003 64位操作系统上不能加载32位应用程序dll 的问题
[FileLoadException: Could not load file or assembly 'sapnco_utils, Version=3.0.0.42, Culture=neutral ...
- 64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多?(一)
前言: cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设计.64位操作系统针对的64位的CPU设计.操 ...
- 让32位应用程序不再为2G内存限制苦恼
最近在做个程序,虽然是小型程序,但是使用的内存量却很大,动辄达到10G.在64位系统上可以轻松实现,无奈我是基于32位的系统进行开发,程序还没跑起来就已经被终止了. 试过很多办法,包括文件内 ...
- IIS启用32位应用程序兼容
针对服务器出现html和jsp页面都可以应用,但唯独asp页面打不开的一种情况 win7的IIS运行在32状态下,原因是ASP程序必须在32位下才能使用ACCESS 设置办法: 打开IIS管理器,点应 ...
- 在64位的ubuntu 14.04 上开展32位Qt 程序开发环境配置(pro文件中增加 QMAKE_CXXFLAGS += -m32 命令)
为了能中一个系统上开发64或32位C++程序,费了些周折,现在终于能够开始干过了.在此记录此时针对Q5.4版本的32位开发环境配置过程. 1. 下载Qt 5.4 的32位版本,进行安装,安装过程中会发 ...
- IIS部署网站只有首页能访问,其他链接失效/运行.net+Access网站-可能原因:IIS未启用32位应用程序模式
在64位的机子上IIS运行32位的.NET程序 由于64位操作系统不支持Microsoft OLE DB Provider for Jet驱动程 也不支持更早的Microsoft Access Dri ...
- Ubuntu不会放弃32位应用程序
Ubuntu 开发人员澄清,人们以为 Ubuntu 将在 Ubuntu 19.10 和后续版本中放弃对运行 32 位应用程序的支持,但“根本不是这种情况”.那么这究竟是怎么一回事呢?前几天 Ubunt ...
随机推荐
- WPF之浅谈数据模板(DataTemplate)
数据模板有什么用 简而言之,数据模板能让你更方便.更灵活的显示你的各类数据.只有你想不到,没有它做不到的(感觉有点夸张,实践之后,你就觉得一点不夸张 ). 直接对比下效果: 无数据模板 应用了数据模板 ...
- 大模型微调技术LoRA与QLoRA
LoRA: Low-Rank Adaptation of Large Language Models 动机 大模型的参数量都在100B级别,由于算力的吃紧,在这个基础上进行所有参数的微调变得不可能.L ...
- Python运维开发之路《python基础介绍》
一. python介绍相关 1. Python简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. - Python 的设计具有很强的可读性,相比其他语言经常使用英文关 ...
- 从数据库中读取数据并写入到Excle电子表格之2
//CC_AutoId, CC_LoginId, CC_LoginPassword, CC_UserName, CC_ErrorTimes, CC_LockDateTime, CC_TestInt ...
- 【SpringCloud】Ribbon
Ribbon 负载均衡原理 order-service 发起 user-service 请求,被ribbon进行拦截; ribbon会向注册中心拉取user-service 相对应的服务; 注册中心返 ...
- 【转载】Linux虚拟化KVM-Qemu分析(十一)之virtqueue
转载自: 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者 ...
- 偷师MapStruct
转自自己的qq空间 2022年10月26日 一个项目看三遍 每遍都有新发现 嘿嘿嘿 我是代码小偷
- Linux 日志收集器:syslog,syslog-ng,rsyslog
一 参考:https://www.cnblogs.com/zhaoyong631/p/14441090.html 基本上,它们都是相同,它们都允许在中央存储库中记录来自不同类型系统的数据. 但是它们是 ...
- linux 查看进程使用的内存大小
你可以使用 ps 命令结合 grep 命令来查看进程使用的内存大小.以下是示例代码: ps aux | grep <进程名> 这个命令会列出所有匹配 <进程名> 的进程,并显示 ...
- 20.1K Star!Notion的开源替代方案:AFFiNE
Notion这款笔记软件相信很多开发者都比较熟悉了,很多读者,包括我自己都用它来记录和管理自己的笔记.今天给大家推荐一个最近比较火的开源替代方案:AFFiNE.目前该开源项目已经斩获20.1K Sta ...