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 ...
随机推荐
- CentOS7环境编译python3.9版本pjsua
环境:CentOS 7.6_x64 Python版本 :3.9.12 pjsip版本:2.13 一.背景描述 pjsip地址:https://www.pjsip.org/ GitHub地址:https ...
- StencilJs学习之事件
其实并没有所谓的 stencil Event,相反 stencil 鼓励使用 DOM event.然而,Stencil 提供了一个 API 来指定组件可以触发的事件,以及组件监听的事件. 这是通过 E ...
- Unity UGUI的所有组件的介绍及使用
Unity UGUI的所有组件的介绍及使用 本文将介绍Unity UGUI中的各个组件,包括它们的具体介绍.用途 1. Text(文本) 介绍:Text组件用于在UI界面上显示文本内容. 用途:常用于 ...
- Redis缓存同步1-策略介绍
缓存数据同步策略示意图 在大多数情况下,我们通过浏览器查询到的数据都是缓存数据,如果缓存数据与数据库的数据存在较大差异的话,可能会产生比较严重的后果的.所以,我们应该也必须保证数据库数据.缓存数据的一 ...
- 一键搞定发布自己Jar到Maven中央仓库
做java 开发那当然离不开jar包管理, 不知何时一直想想封装一个自己的jar包 然后发布到maven中央仓库给别人使用. hhh 我感觉自己写一个jar包工具然后,被很多人使用是一件很牛,很快乐事 ...
- Seal AppManager如何基于Terraform简化基础设施管理
作者简介 陈灿,数澈软件Seal 后端研发工程师,曾在腾讯负责敏捷研发体系建设以及 DevOps 解决方案的敏捷实践.在敏捷研发和产品效能提升有着丰富的经验,致力于构建一站式研发友好的平台工程解决方案 ...
- 2023ccpc大学生程序设计竞赛-wmh
这算是我第一次参加这种团队赛,感谢程老师给我这个机会.刚开赛还算比较顺利,一眼看出来A是个签到,拿下之后开始跟榜F题.一开始想法比较简单,就是排序,记录相邻两个数的差,然后再排序.wa了后以为是范围出 ...
- Semantic Kernel Java SDK,为Java应用程序提供AI功能集成
美国时间 2023 年 7 月 19 日,Semantic Kernel 团队在其官方博客[1]上宣布发布 Java 版Semantic Kernel. Samantic Kernel系列的源代码可在 ...
- iframe与主窗口通信
1. 引言 <iframe> 元素是 HTML 中的一个标签,用于在当前页面中嵌入另一个页面 使用 <iframe> 可以实现以下功能: 嵌入其他网页:可以将其他网页嵌入到当前 ...
- ubuntu 安装sublime
Install the GPG key: wget -qO - https://download.sublimetext.com/sublimehq-pub.gpg | sudo apt-key ad ...