ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows上ZXing C++编译集成指南:VS2022+CMake完整流程

Windows上ZXing C++编译集成指南:VS2022+CMake完整流程 最近在做一个Windows桌面端的扫码工具核心识别库选的是ZXing C。以前在Android上用Java版ZXing很顺手这次换成纯C生态从VS2022安装、CMake配置到编译zxing-cpp绕着坑走了好几圈才把整个流程理顺。这篇文章把完整路径记录下来从环境准备到构建命令再到集成进自己的工程都会说到。如果你正准备在Windows上用C做二维码或条码识别这篇可以直接照着操作。1. 为什么要用ZXing C而不是其他方案1.1 ZXing C是什么、能做什么ZXing是一个老牌的开源条码/二维码解析项目最初以Java版本出名Android端很多扫码功能就是基于它做的。C版的zxing-cpp是这个生态里的原生C实现它不是把Java代码机械翻译过来而是按照C的语言特性重新实现了核心解码逻辑性能和内存控制都比Java版更适合桌面和服务端使用。具体到能力zxing-cpp目前支持QR Code、Micro QR Code、Data Matrix、Aztec、MaxiCode、Code 39、Code 93、Code 128、Codabar、EAN-8、EAN-13、ITF、UPCA、UPCE等常见码制同时支持二维码的生成也就是既能解码也能编码。对于我这种需要在Windows下批量识别图片条码的场景它开箱即用不需要再为一两种码制去对接多个库API也统一维护省心。1.2 和ZBar、OpenCV等其他方案比为什么选它很多人一提到C条码库第一个想到的是ZBar。ZBar确实经典但问题也很明显项目多年不活跃对QR Code的容错和畸变支持跟不上现在的真实拍摄场景。实际测试里把一张带轻微反光、边缘裁切过的二维码图丢进去ZBar经常解不出来而zxing-cpp还能恢复出内容。OpenCV也自带QRCodeDetector但它主要只处理QR码不支持Code 128、EAN这种一维码而且OpenCV的体积对很多工具类项目来说是沉重的依赖。相比之下zxing-cpp的core库静态编译后也就几MB级别整体可控性强。如果业务里有多种码制混合识别、同时对性能和体积有要求它会是一个很合适的基底。从许可证角度看zxing-cpp基于Apache License 2.0商用友好不需要像GPL项目那样担心开源传染问题。这也是我最终选它的一个重要考量。2. 环境准备VS2022与CMake安装关键点2.1 VS2022安装时经常漏掉的组件Windows下编译C项目VS2022本身要装对否则后面CMake配置时会直接卡在“找不到编译器”这一步。打开Visual Studio Installer找到“使用C的桌面开发”这个工作负载这里有几项必须勾选MSVC v143 C生成工具这是核心编译器Windows 10/11 SDK缺了它连基本的windows.h都可能找不到最新版C v143生成工具对应平台以及“C CMake tools for Windows”如果之前只装了“.NET桌面开发”那CMake配置的时候一定会遇到C编译器缺失的问题。我的习惯是装完VS2022后用Visual Studio Installer补装“使用C的桌面开发”这个过程需要下载几个GB耐心等完就好。安装完成后可以用“开始菜单 - Visual Studio 2022 - Developer Command Prompt”打开命令行执行cl命令确认编译器环境可用。2.2 把CMake加入PATH解决cmdlet识别问题很多初学者遇到的第一道坎就是在PowerShell里敲cmake结果报出这句cmake : 无法将“cmake”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写...这就是因为CMake没有加入系统PATH。VS2022虽然内置了CMake但它在Visual Studio的私有目录里命令行默认找不到。最简单的方式是单独下载安装CMake。到cmake.org下载Windows x64版本安装包安装时务必勾选“Add CMake to the system PATH for all users”。如果安装时忘了勾选可以手动把CMake安装目录下的bin路径通常是C:\Program Files\CMake\bin加到系统环境变量的Path里。配置完PATH后重新开一个终端窗口注意是全新的窗口旧窗口不会自动刷新环境变量执行cmake --version如果能看到版本号比如cmake version 3.29.3这步就算过了。顺手跑一下cmake --help能看到当前环境下支持的生成器列表后面配置VS2022生成器时会用到。3. 获取ZXing C源码与CMake配置思路3.1 源码下载和仓库结构zxing-cpp的官方GitHub仓库地址是github.com/zxing-cpp/zxing-cpp。下载方式有两种装了Git就用命令拉取不想装Git就直接在Releases页面下载Source code压缩包。如果使用Git建议加--depth 1参数只拉最新提交因为完整历史记录很占空间我们编译库根本用不到那些历史信息git clone --depth 1 https://github.com/zxing-cpp/zxing-cpp.git下载完成后先别急着配置建议花几分钟看一下目录结构。各个版本的目录会有些差异但核心目录通常是这样的core解码和编码的核心实现头文件在core/src/zxing下主库就从这个目录构建example示例程序通过ZXING_EXAMPLES选项控制是否编译wrappers一些其他语言的封装我们不需要管顶层CMakeLists.txt就在仓库根目录所以配置源码目录时直接指向仓库根目录就行。这里提醒一句整个路径里不要有中文、不要有空格后面你会感谢这个习惯的。3.2 用CMake生成VS2022工程生成器、架构和第一次配置CMake的本质是“生成本地构建工程”在Windows上最常用的生成器就是“Visual Studio 17 2022”。它会把项目转换成VS解决方案文件然后你就可以直接用Visual Studio打开、点构建按钮也可以用命令行继续构建。先看核心配置命令cmake -S zxing-cpp -B zxing-cpp-build -G Visual Studio 17 2022 -A x64拆开看-S zxing-cpp指定源码根目录-B zxing-cpp-build指定构建目录所有生成文件都在这里源码目录保持干净-G Visual Studio 17 2022告诉CMake用VS2022生成器-A x64指定目标架构是64位如果你的程序要跑在32位环境把-A改成Win32就行。这一步执行成功后CMake会做编译器自检、创建解决方案文件等操作控制台会输出大量信息最后没有红色错误就说明配置阶段通过了。初次配置成功后会生成zxing-cpp-build目录里面有一个.sln后缀的解决方案文件以后也可以直接在VS里打开它来构建。顺便提一句如果你想用Ninja生成器追求更快的构建速度也可以把-G改成“Ninja”但这需要你在VS开发者命令行里执行配置命令让CMake能找到MSVC工具链操作复杂度高不少。对大多数场景我建议直接使用Visual Studio生成器少折腾。3.3 必看CMake选项静态库还是动态库示例要不要编zxing-cpp的CMake配置提供不少选项不过我们日常构建最关注的就几个。为了看清楚有哪些可用选项可以先执行cmake -S zxing-cpp -B zxing-cpp-build -G Visual Studio 17 2022 -A x64 -L-L参数会把缓存中的CMake变量列出来让你看到这个版本实际支持哪些开关。不同版本的选项名可能会有调整下面是几个高频项选项作用建议值BUILD_SHARED_LIBS控制生成动态库还是静态库想省事用OFF静态库ZXING_EXAMPLES是否编译示例程序首次构建建议ON方便验证ZXING_READERS控制启用哪些解码器默认全启用可自定义ZXING_WRITERS控制启用哪些编码器需要生成二维码时保持ON静态库和动态库的选择是个关键决策。静态库OFF会把代码直接编进你的exe里部署时不需要额外携带ZXing.dll路径问题少动态库ON会生成ZXing.dll和导入库ZXing.lib如果你的多个程序都要用同一个ZXing动态库能省内存但部署时要记得把dll放到exe目录或PATH里。我个人的建议是先构建一个静态库版本用于开发调试后面做部署时再按需切换。下面是完整版配置命令cmake -S zxing-cpp -B zxing-cpp-build -G Visual Studio 17 2022 -A x64 -DBUILD_SHARED_LIBSOFF -DZXING_EXAMPLESON设好之后执行cmake --build就能得到静态库和示例程序。4. 实测构建过程与VS工程打开调试4.1 命令行构建和VS图形界面构建配置完成之后可以选择两种方式构建。命令行构建更直观也方便看完整日志cmake --build zxing-cpp-build --config Release--config参数用来指定构建配置因为Visual Studio生成器支持多配置并行所以用命令行构建时必须显式指定Release或Debug。这里建议先用Release构建原因很简单Debug版本的ZXing解码性能会明显下降有些场景甚至慢到让你误以为程序卡死调试库内部逻辑时才需要单独编Debug版本。如果你习惯用VS界面操作也可以直接打开zxing-cpp-build目录下的.sln文件在解决方案管理器里找到ZXing项目右键选择“生成”。构建成功后VS底部输出窗口会显示成功信息同时给出生成的库文件路径。整个构建过程取决于机器性能通常几十秒到几分钟不等。构建完成后顺手看一眼example目录如果看到编译出来的可执行程序说明示例也一起生成了可以直接拿图片测试识别效果。4.2 构建产物在哪库文件和头文件构建成功后的产物位置在不同版本里会有些差异但基本遵循CMake的输出规律。以静态库Release构建为例你通常会在类似下面的路径找到结果zxing-cpp-build/core/Release/ZXing.libzxing-cpp-build/example/Release/ZXingReader.exe动态库模式下core/Release下会出现ZXing.dll和ZXing.lib其中ZXing.lib是导入库链接程序时用的还是它运行时才需要dll。头文件目录在源码的core/src下面核心头文件是zxing/ZXing.h引入这个头文件就能拿到解码和编码的全部接口。如果头文件找不到可以全盘搜索ZXing.h确认一下实际位置然后记住这个include目录的完整路径。构建产物建议不要折腾直接在当前构建目录使用即可。需要长期复用的话可以执行CMake的安装指令cmake --install zxing-cpp-build --prefix D:/local/zxing这会把需要的头文件、库文件安装到D:/local/zxing目录下相当于手动整理了一份“开发包”后面新项目引用起来更干净。4.3 把ZXing集成到自己的项目两种方式以我实际的项目为例目标是要在一个Windows桌面工具里调用ZXing识别二维码有两种常见接法。第一种如果你的项目本身就是CMake工程那就直接在CMakeLists.txt里引入cmake_minimum_required(VERSION 3.20) project(MyScanner LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) find_package(ZXing CONFIG REQUIRED) add_executable(my_scanner main.cpp) target_link_libraries(my_scanner PRIVATE ZXing::ZXing)要让find_package找到ZXing的配置文件需要在配置你的项目时通过CMAKE_PREFIX_PATH指定ZXing的安装目录或构建目录比如cmake -S . -B build -G Visual Studio 17 2022 -A x64 -DCMAKE_PREFIX_PATHD:/local/zxing第二种如果是普通的VS工程不走CMake那就手动配置在项目属性里找到C/C的“附加包含目录”填上zxing头文件路径比如D:/local/zxing/include在“链接器 - 输入 - 附加依赖项”里加上ZXing.lib再在“链接器 - 常规 - 附加库目录”里填上库文件路径。动态库版本的话记得把ZXing.dll复制到exe输出目录。如果你用的是vcpkg也可以直接vcpkg install zxing-cpp装完在CMake里同样用find_package(ZXing CONFIG REQUIRED)引入。这种方式管理依赖最省心但国内网络状态下vcpkg下载源码可能比较慢我这次是直接源码构建的流程完全可控。5. 常见问题与排查技巧实录5.1 cmake命令找不到或者版本太旧“cmake不是内部或外部命令”和“无法将cmake项识别为cmdlet”是同一个问题的两种说法本质都是PATH里没有CMake。处理办法前面已经说过了装CMake时勾选Add to PATH或者手动把CMake的bin目录加到系统Path。还有一种隐蔽情况机器上装了老版本的CMake版本号还是3.10甚至更早然后VS2022的某些新特性或zxing-cpp的新版本要求CMake版本过高配置时就会报“CMake 3.16 or higher is required”。解决办法是卸载旧版装新版CMake然后执行where cmake确认现在生效的是哪个目录下的cmake。别只看内部版本要与实际shell执行路径对照。5.2 配置时报错找不到C编译器报错一般长这样No CMAKE_CXX_COMPILER could be found.原因绝大多数是VS2022没有安装“使用C的桌面开发”工作负载或者安装不完整。打开Visual Studio Installer确认勾选状态后再修复一次。少数情况是CMake版本太老不认识VS2022的编译器工具集升级CMake到最新版即可。另外还有个容易踩的坑如果你用的是“Visual Studio 16 2019”这个生成器CMake会自动去找VS2019而机器上根本没有VS2019自然找不到编译器。生成器版本必须和实际安装的VS版本对齐VS2022就用“Visual Studio 17 2022”。5.3 项目集成时C标准不够新zxing-cpp新版明确要求C17或更高版本如果你的项目还在C14标准下编译会看到各种从zxing头文件爆出来的语法错误比如std::optional、std::string_view相关的内容。在CMake里显式指定标准set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON)如果项目里还有自定义的编译选项注意别让它们覆盖了标准设置。在VS里非CMake项目则可以通过项目属性里的“C/C - 语言 - C语言标准”改成“ISO C20标准”。5.4 链接错误和运行找不到DLL链接阶段最常见的错误是LNK1104 无法打开文件“ZXing.lib”这个通常是附加库目录没有配对或者架构不匹配。你构建的是x64的ZXing.lib但主项目在x86模式下链接路径对不上又或者反过来Win32的库被用在x64的程序里。检查一下项目平台和构建架构是否一致。动态库模式下还有一个运行期经典问题exe编译链接都通过但双击运行时弹窗说找不到ZXing.dll。解决办法是把ZXing.dll复制到exe同目录或者把dll所在目录加入系统PATH。Debug和Release的dll要注意区分混合使用会出现运行时库冲突表现是莫名崩溃或者内存错误。5.5 中文路径、空格路径带来的各种诡异问题源码目录、构建目录如果包含中文或者空格CMake和MSVC虽然不至于完全不能工作但经常会出现一些难以解释的报错比如找不到文件、无法启动程序、参数错误等。我的建议是所有路径统一用纯英文目录比如D:\dev\zxing-cpp包括你项目里引用ZXing的头文件路径和库路径也一样处理。这个问题看着是小实际踩中一次就够折腾半天。5.6 GitHub下载慢或者clone失败拉取zxing-cpp源码如果速度不理想最直接的办法是去Releases页面下载源代码压缩包浏览器直接下载通常比Git协议稳定。如果网络不佳也可以去国内代码托管平台的同步镜像仓库或者用gitee的仓库镜像。下载前看清楚是source code不是Assets里那些预编译二进制。源码文件不大但涉及网络问题建议多尝试几个入口找个能稳定下载的即可。我在Windows 11 VS2022 CMake 3.29的环境下编译通过换成VS2022社区版也没问题步骤完全一致。如果你后续也要做批量识图或者桌面端二维码工具建议在Release模式下测试解码速度优先用静态库部署能少踩不少动态库依赖的坑。
返回列表