1. 背景介绍

最近需要使用第三方动态库文件G33DDCAPI.dll进行二次开发。由于这个动态库文件生成的时间比较早,且只提供了32位的版本,并没有提供源代码。如果希望利用这个动态库进行开发,有两种解决方法:

  1. 编译64位应用程序,但需要在64位程序中链接32位动态库;
  2. 将整个程序编译为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命令可以看到自己到底是安装的那种编译器:

  1. mingw32-gcc.exe 编译器将在32位系统上构建32位应用程序。由于MinGW项目已经很久没有更新了,且只能编译32位程序,不推荐安装。执行gcc -v后,可以看到Target显示为mingw32,这表示你安装的编译器是老旧的MinGW版本。

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

  3. 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位应用程序的更多相关文章

  1. 64位系统运行32位Oracle程序解决方案

    Attempt to load Oracle client libraries threw BadImageFormatException. This problem will occur when ...

  2. 关于oracle 11g 64位与 32位的 plsql、及其他32位应用程序共存的问题

    因为 plsql 不支持 64位 oracle 客户端,所以plsql 必须使用 oracle 的 32位 instanclient 包.  解压缩后放一个目录,例如: D:\Oracle\insta ...

  3. 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序。

    原文 使 IIS 6.0 可以在 64 位 Windows 上运行 32 位应用程序 试图加载格式不正确的程序. win7 64位操作系统上边运行IIS网站应用的时候,提示错误"试图加载格式 ...

  4. 解决windows server2003 64位操作系统上不能加载32位应用程序dll 的问题

    [FileLoadException: Could not load file or assembly 'sapnco_utils, Version=3.0.0.42, Culture=neutral ...

  5. 64位系统下,一个32位的程序究竟可以申请到多少内存,4GB还是更多?(一)

    前言: cpu的位是指一次性可处理的数据量是多少,1字节=8位,32位处理器可以一次性处理4个字节的数据量,依次类推.32位操作系统针对的32位的CPU设计.64位操作系统针对的64位的CPU设计.操 ...

  6. 让32位应用程序不再为2G内存限制苦恼

    最近在做个程序,虽然是小型程序,但是使用的内存量却很大,动辄达到10G.在64位系统上可以轻松实现,无奈我是基于32位的系统进行开发,程序还没跑起来就已经被终止了.      试过很多办法,包括文件内 ...

  7. IIS启用32位应用程序兼容

    针对服务器出现html和jsp页面都可以应用,但唯独asp页面打不开的一种情况 win7的IIS运行在32状态下,原因是ASP程序必须在32位下才能使用ACCESS 设置办法: 打开IIS管理器,点应 ...

  8. 在64位的ubuntu 14.04 上开展32位Qt 程序开发环境配置(pro文件中增加 QMAKE_CXXFLAGS += -m32 命令)

    为了能中一个系统上开发64或32位C++程序,费了些周折,现在终于能够开始干过了.在此记录此时针对Q5.4版本的32位开发环境配置过程. 1. 下载Qt 5.4 的32位版本,进行安装,安装过程中会发 ...

  9. IIS部署网站只有首页能访问,其他链接失效/运行.net+Access网站-可能原因:IIS未启用32位应用程序模式

    在64位的机子上IIS运行32位的.NET程序 由于64位操作系统不支持Microsoft OLE DB Provider for Jet驱动程 也不支持更早的Microsoft Access Dri ...

  10. Ubuntu不会放弃32位应用程序

    Ubuntu 开发人员澄清,人们以为 Ubuntu 将在 Ubuntu 19.10 和后续版本中放弃对运行 32 位应用程序的支持,但“根本不是这种情况”.那么这究竟是怎么一回事呢?前几天 Ubunt ...

随机推荐

  1. WPF之浅谈数据模板(DataTemplate)

    数据模板有什么用 简而言之,数据模板能让你更方便.更灵活的显示你的各类数据.只有你想不到,没有它做不到的(感觉有点夸张,实践之后,你就觉得一点不夸张 ). 直接对比下效果: 无数据模板 应用了数据模板 ...

  2. 大模型微调技术LoRA与QLoRA

    LoRA: Low-Rank Adaptation of Large Language Models 动机 大模型的参数量都在100B级别,由于算力的吃紧,在这个基础上进行所有参数的微调变得不可能.L ...

  3. Python运维开发之路《python基础介绍》

    一. python介绍相关 1. Python简介 Python 是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言. - Python 的设计具有很强的可读性,相比其他语言经常使用英文关 ...

  4. 从数据库中读取数据并写入到Excle电子表格之2

     //CC_AutoId, CC_LoginId, CC_LoginPassword, CC_UserName, CC_ErrorTimes, CC_LockDateTime, CC_TestInt ...

  5. 【SpringCloud】Ribbon

    Ribbon 负载均衡原理 order-service 发起 user-service 请求,被ribbon进行拦截; ribbon会向注册中心拉取user-service 相对应的服务; 注册中心返 ...

  6. 【转载】Linux虚拟化KVM-Qemu分析(十一)之virtqueue

    转载自: 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者 ...

  7. 偷师MapStruct

    转自自己的qq空间 2022年10月26日 一个项目看三遍 每遍都有新发现 嘿嘿嘿 我是代码小偷

  8. Linux 日志收集器:syslog,syslog-ng,rsyslog

    一 参考:https://www.cnblogs.com/zhaoyong631/p/14441090.html 基本上,它们都是相同,它们都允许在中央存储库中记录来自不同类型系统的数据. 但是它们是 ...

  9. linux 查看进程使用的内存大小

    你可以使用 ps 命令结合 grep 命令来查看进程使用的内存大小.以下是示例代码: ps aux | grep <进程名> 这个命令会列出所有匹配 <进程名> 的进程,并显示 ...

  10. 20.1K Star!Notion的开源替代方案:AFFiNE

    Notion这款笔记软件相信很多开发者都比较熟悉了,很多读者,包括我自己都用它来记录和管理自己的笔记.今天给大家推荐一个最近比较火的开源替代方案:AFFiNE.目前该开源项目已经斩获20.1K Sta ...