Windows C++项目部署实战:从VS构建到打包分发的完整指南
1. 项目概述从编码到交付的最后一公里在Windows平台上用Visual Studio以下简称VS开发C项目写代码、调试、跑通单元测试这通常只完成了整个工作流的一半。真正的挑战往往出现在“部署”这个环节。无论是将你的库分发给团队其他成员还是将可执行程序打包给最终用户又或是为持续集成/持续部署CI/CD流水线准备构建产物一个清晰、可靠、可重复的部署流程都至关重要。很多开发者尤其是刚入门的常常止步于“在我的机器上能跑”一旦换台机器或者交给别人就各种依赖缺失、路径错误、运行时库版本不匹配。这篇文章我就以一个在Windows下用VS摸爬滚打了十多年的老码农视角来彻底拆解C项目的部署流程。这不仅仅是点几下“生成”按钮而是涵盖从项目配置、依赖管理、构建模式选择到打包、分发和环境准备的一整套工程实践。无论你开发的是动态链接库DLL、静态库LIB还是独立的桌面应用程序这里面的核心逻辑和避坑技巧都是相通的。2. 部署流程的核心思路与设计考量部署的本质是将你的源代码、依赖项和配置转化成一个可以在目标环境中独立、稳定运行的软件包。在Windows C生态里这个目标环境可能千差万别可能是同事安装了相同VS版本的开发机可能是没有安装VS但装了对应运行库的用户电脑也可能是云端一个纯净的Windows Server容器。你的部署流程必须能适应这些场景。2.1 明确部署目标与产物类型首先你得想清楚你要部署什么。这直接决定了后续所有步骤。开发库部署你写了一个功能强大的C库要分发给团队内其他项目使用。产物通常是静态库.lib代码被链接到使用它的程序中。部署简单只需要头文件.h/.hpp和.lib文件。但库的更新需要所有使用方重新编译链接。动态链接库.dll 导入库.lib运行时加载。部署需要.dll、对应的.lib用于链接时定位导出符号和头文件。更新.dll可能无需重新编译主程序但需注意ABI应用程序二进制接口兼容性。头文件库Header-only整个库实现在头文件中如许多现代C库。部署最简单只需拷贝头文件但会增加编译时间。应用程序部署你开发了一个可执行的软件.exe。这是最常见的场景。产物是.exe文件但它几乎不可能真正“独立”总会依赖一些东西VC 运行时库VCRuntime这是最大的“坑”。你的程序是用VS编译的它依赖于msvcp140.dll,vcruntime140.dll等。目标机器上可能没有。通用C运行时UCRTWindows 10之后部分C标准库函数放在这里。第三方动态库.dll比如你用了OpenCV的opencv_world450.dll或者Qt的Qt5Core.dll等。配置文件、资源文件如.ini,.json, 图片、字体等。2.2 构建配置的基石Release与目标平台在VS里你肯定见过“Debug”和“Release”配置下拉框。对于部署必须使用Release配置进行构建。原因如下性能Release模式开启了所有优化/O2, /Ox去掉了调试符号生成的代码更小、更快。无调试依赖Debug构建会链接到调试版本的运行时库如msvcp140d.dll这些库通常不会安装在用户机器上。符号文件.pdb即使Release模式也可以生成程序数据库文件.pdb用于日后崩溃分析。但部署给用户时通常不包含.pdb文件除非你需要收集用户现场的崩溃转储。目标平台x86, x64, ARM64也必须明确。你不能把一个64位的程序x64部署到只支持32位x86的系统上。在VS项目属性页的“配置管理器”中务必为你的部署版本创建并选择正确的平台配置例如“Release | x64”。2.3 依赖管理策略复制本地与静态链接如何处理第三方依赖是部署设计的关键决策点。对于动态库.dll依赖复制到本地Copy Local在项目引用中将第三方.dll的“复制到输出目录”属性设置为“始终复制”或“如果较新则复制”。这是最直接的方法确保构建后所有需要的.dll都出现在你的$(OutDir)通常是bin\Release\下。修改PATH环境变量另一种方式是将依赖.dll所在目录添加到系统的PATH环境变量或者在你的应用程序启动时临时修改PATH。但这增加了环境配置的复杂性不推荐作为主要部署方式。对于静态库.lib依赖静态库的代码会被直接链接进你的.exe或.dll因此部署时不需要额外携带.lib文件只需要确保编译时能找到它们。对于VC运行时库动态链接/MD 或 /MDd这是默认设置。你的程序依赖外部的msvcp140.dll等。部署时要么要求用户安装对应的“Microsoft Visual C Redistributable”要么将这些.dll随你的程序一起分发在某些许可下是允许的。静态链接/MT 或 /MTd在项目属性 - C/C - 代码生成 - 运行时库中选择“多线程/MT”。这样会将运行时库的代码静态链接到你的程序中生成的可执行文件会变大但彻底摆脱了对VC Redistributable的依赖。这是制作“绿色版”单文件程序的常用手段。但要注意如果多个这样的模块exe/dll在同一个进程内混合使用静态链接可能导致内存管理、异常处理等内部状态冲突。实操心得对于面向广大普通用户的桌面应用我强烈建议采用“/MD 打包VC Redistributable安装器”的组合。这样既控制了主程序体积又通过安装器确保了运行时环境的可靠性。对于内部工具或环境可控的场景可以考虑/MT。但永远不要在Debug构建中使用/MTd进行部署。3. 实战部署流程详解理论说完我们进入实战。假设我们有一个名为MyApp的Win32控制台应用程序它依赖一个第三方数学库MathLib.dll并且使用了一些C17标准库特性。3.1 项目配置与预处理创建专用的发布配置虽然VS自带Release配置但为了更精细的控制我习惯复制一份并重命名比如“ReleaseForDeploy”。在配置管理器中从“Release”新建配置“ReleaseForDeploy”。在此配置下打开项目属性进行以下关键设置C/C - 代码生成 - 运行时库选择“多线程DLL (/MD)”。C/C - 优化选择“最大优化优选速度(/O2)”。链接器 - 调试 - 生成调试信息选择“优化以便于调试 (/DEBUG)”或“程序数据库 (/Zi)”。即使部署也建议生成PDB用于后续线上问题诊断。你可以选择不将其打包给用户但自己一定要存档。链接器 - 高级 - 入口点确认正确对于控制台程序通常是mainCRTStartup。链接器 - 清单文件 - 生成清单通常保持“是”。清单会嵌入或生成外部文件声明对UCRT等程序集的依赖。处理第三方依赖将MathLib.dll和MathLib.lib导入库放入项目目录下的一个文件夹比如ThirdParty\MathLib\。在项目属性中C/C - 常规 - 附加包含目录添加ThirdParty\MathLib\include假设头文件在此。链接器 - 常规 - 附加库目录添加ThirdParty\MathLib\lib。链接器 - 输入 - 附加依赖项添加MathLib.lib。将MathLib.dll的“复制到输出目录”属性设置为“始终复制”。你可以在解决方案资源管理器中选中该文件如果已添加到项目中或在项目生成后事件中编写拷贝命令。3.2 构建与产出物收集执行构建在VS中选择“ReleaseForDeploy | x64”配置点击“生成解决方案”。构建成功后打开输出目录例如x64\ReleaseForDeploy\你应该看到MyApp.exe- 你的主程序。MyApp.pdb- 程序数据库文件可选打包。MathLib.dll- 被自动复制过来的第三方依赖。可能还有MyApp.exe.manifest- 外部清单文件如果未嵌入。手动收集遗漏的依赖这是关键一步MathLib.dll是我们已知的但VC运行时库呢我们可以使用dumpbin工具来查看。打开“VS开发人员命令提示符”或“VS开发人员PowerShell”。切换到你的输出目录执行dumpbin /dependents MyApp.exe查看输出你会看到类似这样的依赖Image has the following dependencies: KERNEL32.dll USER32.dll ... VCRUNTIME140.dll MSVCP140.dll api-ms-win-crt-*.dll // 这些是UCRT MathLib.dllKERNEL32.dll,USER32.dll等是系统核心DLL所有Windows机器都有。你需要关注的是VCRUNTIME140.dll,MSVCP140.dll和api-ms-win-crt-*.dll。3.3 打包策略安装程序 vs 绿色压缩包如何将收集到的文件交给用户有两种主流方式。制作安装程序Installer工具选择高级安装程序Advanced Installer、InstallShield、WiX Toolset、Inno Setup、NSIS等。VS自带的“安装项目”模板已过时不推荐。核心任务将你的MyApp.exe、MathLib.dll等文件打包。包含VC Redistributable安装包这是安装程序的巨大优势。你可以在安装流程中静默运行或提示用户安装对应版本的VC Redistributable一个.exe文件如vc_redist.x64.exe。微软官方允许你随应用分发它。创建开始菜单快捷方式、桌面图标。写入必要的注册表项如果需要。提供卸载功能。优点专业用户体验好能处理复杂的依赖和环境配置。缺点需要学习额外的工具和脚本。制作绿色压缩包Portable Zip将输出目录x64\ReleaseForDeploy\下的所有文件除了.pdb和.ilk等中间文件打包成一个ZIP文件。必须手动解决VC运行时依赖方案A推荐在ZIP包内附带一个readme.txt明确告知用户需要先安装“Microsoft Visual C 2015-2022 Redistributable (x64)”并附上微软官方下载链接。方案B静态链接如前所述使用/MT编译你的程序。这样生成的MyApp.exe理论上可以直接运行在纯净的Windows上。但请再次注意与其它动态库混合使用的风险。方案C携带DLL将vcruntime140.dll,msvcp140.dll等从你的VS安装目录如C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Redist\MSVC\14.xx.xxxxx\x64\Microsoft.VC14x.CRT\拷贝出来和你的程序放在一起。务必仔细阅读微软的再分发许可条款确保你的行为是合规的。优点简单无需安装适合工具类、内部软件。缺点依赖问题需要用户手动解决显得不够专业。注意事项无论哪种方式绝对不要直接从系统目录如C:\Windows\System32下拷贝系统DLL如msvcp140.dll来分发。这些DLL是系统组件版本和你的程序可能不匹配且法律上不允许随意分发。正确的来源是VC Redistributable包或VS安装目录下的Redist文件夹。3.4 自动化与进阶生成后事件与CI/CD对于需要频繁构建和部署的项目手动操作太低效。我们可以利用VS的“生成后事件”来实现半自动化。编写生成后事件脚本在项目属性 - 生成事件 - 生成后事件中可以输入命令行。例如创建一个自动收集文件并打包的脚本REM 复制必要的第三方DLL到输出目录如果未自动复制 xcopy /Y $(ProjectDir)ThirdParty\MathLib\*.dll $(OutDir) REM 使用7-Zip命令行版将输出目录打包成ZIP以当前日期时间命名 C:\Program Files\7-Zip\7z.exe a -tzip $(ProjectDir)..\Deploy\MyApp_%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%.zip $(OutDir)* -x!*.pdb -x!*.ilk -x!*.exp -x!*.lib这样每次成功构建后都会在项目上一级的Deploy文件夹中生成一个带时间戳的ZIP包。集成到CI/CD流水线在Azure DevOps、GitHub Actions或Jenkins等CI/CD平台上你可以创建一个构建任务Pipeline。任务步骤通常包括拉取源代码。使用命令行调用MSBuild或CMake构建你的VS项目指定/p:ConfigurationReleaseForDeploy /p:Platformx64。运行测试如果有。部署步骤将构建产物$(OutDir)下的文件打包、归档或者推送到文件服务器、生成安装程序。对于VC Redistributable可以在流水线中下载其安装包并一起打包。这实现了“一键构建、测试、打包”的全自动化部署流程。4. 常见问题与排查技巧实录即使流程再清晰实际部署中还是会踩坑。下面是我总结的一些典型问题及解决方法。4.1 “应用程序无法启动因为找不到XXX.dll”这是最经典的错误。通常是因为目标机器缺少某个动态库。排查步骤本地验证在你自己的开发机上将构建好的整个输出文件夹如ReleaseForDeploy拷贝到一个全新的、没有VS和任何特殊环境变量的目录比如桌面新建一个文件夹然后双击运行.exe。如果能跑说明你的打包是完整的如果报错就能立刻发现少了哪个.dll。使用Dependency Walker或dumpbin如上所述用dumpbin /dependents仔细检查.exe依赖的所有非系统DLL。确保每一个都出现在了你的部署包中。注意隐式依赖有些库如OpenCV可能依赖其他库如Intel IPP, FFmpeg。你需要递归地检查所有依赖库的依赖。系统搜索路径系统会按特定顺序搜索DLL程序所在目录 - 系统目录等。最保险的做法就是把所有依赖的.dll都放在.exe的同级目录下。4.2 “0xc000007b”应用程序错误这个错误码通常意味着应用程序的位数不匹配。例如你尝试运行一个64位x64的程序但加载了一个32位x86的.dll或者反过来。解决方法确保你的主程序.exe和所有它依赖的.dll包括VC运行时库都是相同的目标平台全是x86或全是x64。使用dumpbin /headers YourDll.dll | findstr machine可以查看一个DLL的位数显示8664 machine (x64)或14C machine (x86)。如果你在64位系统上部署要特别注意那些只有32位版本的第三方库。你可能需要为你的程序选择x86平台进行构建。4.3 不同Windows版本上的兼容性问题你的程序在Win10上正常在Win7或Win Server上崩溃。主要原因API可用性你使用了新版Windows SDK才提供的API。在项目属性 - 常规 - Windows SDK版本中可以尝试选择较低的版本以增加兼容性但要注意功能限制。UCRT版本Windows 10之前的系统如Win7 SP1需要单独安装UCRT更新包。这也是为什么微软建议通过安装VC Redistributable来解决因为它包含了正确版本的UCRT。静态链接/MT的陷阱如前所述使用/MT静态链接运行时库在某些极端情况下如果目标系统内核层相关结构与静态库不兼容也可能引发问题。对于需要广泛兼容性的程序动态链接/MD并分发Redistributable通常是更安全的选择。4.4 部署后程序性能或行为与Debug模式不一致这通常不是部署流程问题而是代码本身在Release优化下暴露的缺陷。常见原因未初始化变量Debug模式下变量可能被编译器初始化为特定值如0xCDCDCDCD而Release模式不会导致随机值。断言assert失效Release模式通常会移除assert宏使得某些条件检查被跳过。优化导致的逻辑错误激进的编译器优化可能会改变某些未定义行为UB代码的执行顺序导致结果异常。调试技巧保留Release模式生成的.pdb文件。在用户环境崩溃时收集崩溃转储.dmp文件。在你的开发机上用相同的.pdb文件和源代码加载这个.dmp文件到VS或WinDbg中可以进行事后调试定位崩溃点。这就是为什么我强调即使部署版本也要生成调试信息。4.5 问题排查速查表问题现象可能原因排查步骤启动报错“找不到XXX.dll”依赖的DLL未随程序分发1. 使用dumpbin /dependents检查依赖。2. 确保所有非系统DLL都在.exe同级目录。错误 0xc000007b程序与DLL位数不匹配x86/x64混用使用dumpbin /headers检查.exe和所有.dll的位数是否一致。程序在用户机器上崩溃开发机正常缺少VC运行库或UCRT系统版本差异代码存在未定义行为1. 确保用户安装了对应版本的VC Redistributable。2. 检查是否使用了高版本Windows特有的API。3. 使用Release模式下的调试符号(.pdb)和崩溃转储进行分析。程序运行缓慢误部署了Debug版本或带有调试信息的Release版本检查是否错误地打包了Debug构建的.exe或Release构建时未开启优化/O2。安装程序运行时提示“另一个安装正在进行”系统安装服务被占用或残留重启计算机或使用微软官方“Program Install and Uninstall troubleshooter”工具修复。部署是一个系统工程它考验的不仅是编码能力更是对构建工具链、操作系统和软件分发的理解。一个好的部署流程应该是自动化、可重复、且能生成清晰交付物的。从配置项目属性开始到最终生成一个用户能轻松安装运行的软件包每一步都值得仔细推敲。我个人最深刻的体会是尽早建立并测试你的部署流程不要等到项目快上线时才来做。把它当成开发的一部分每次重要的功能提交后都走一遍完整的构建和部署测试这样才能在最后关头避免手忙脚乱。对于团队项目可以考虑将部署脚本和配置纳入版本控制确保任何成员都能一键生成完全一致的发布包。

相关新闻

短视频团队紧急必读:AI慢动作生成合规风险预警(含Deepfake标识新规、版权溯源链构建指南)

短视频团队紧急必读:AI慢动作生成合规风险预警(含Deepfake标识新规、版权溯源链构建指南)

更多请点击: https://kaifayun.com 第一章:AI视频慢动作生成的技术本质与行业现状 AI视频慢动作生成并非简单地重复帧或线性插值,其技术本质是基于深度学习的时空域联合建模——在保持运动物理一致性的前提下,预测并合成中间帧。…

2026/7/24 13:45:06阅读更多 →
特征提取与无监督学习核心技术解析

特征提取与无监督学习核心技术解析

1. 特征提取与无监督学习概述在数据科学和机器学习领域,特征提取和无监督学习是两大基础且关键的技术方向。特征提取是从原始数据中提取有意义的、可量化的特征的过程,而无监督学习则是在没有标注数据的情况下发现数据中的模式和结构。这两者的结合为处理…

2026/7/24 13:43:05阅读更多 →
AM5718硬件设计实战:JTAG可靠调试与DDR3高速内存系统设计避坑指南

AM5718硬件设计实战:JTAG可靠调试与DDR3高速内存系统设计避坑指南

1. 项目概述与核心价值在嵌入式硬件开发,尤其是基于TI Sitara系列这类高性能异构多核处理器的项目中,有两个环节的硬件设计质量直接决定了整个项目的成败:一个是用于调试和烧录的JTAG接口,另一个则是关乎系统性能与稳定性的DDR3内…

2026/7/24 13:43:05阅读更多 →
Python毕设项目: 基于Python的香港历史资料整理与科普传播系统实现 校园香港历史科普学习平台设计与实现(源码+文档,讲解、调试运行,定制等)

Python毕设项目: 基于Python的香港历史资料整理与科普传播系统实现 校园香港历史科普学习平台设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/24 16:43:49阅读更多 →
GG3M技术:学术理论与产业实践的差异分析

GG3M技术:学术理论与产业实践的差异分析

1. 关于GG3M的学术与产业视角差异解析GG3M作为一项新兴技术范式,近年来在学术界和产业界引发了截然不同的讨论声浪。上周参加行业技术峰会时,我与几位高校教授和科技公司CTO的交流就充分体现了这种认知鸿沟——教授们更关注理论突破的可能性,…

2026/7/24 16:43:49阅读更多 →
科技创造的价值,到底谁来定义?

科技创造的价值,到底谁来定义?

科技创造的价值,到底谁来定义? ——不是没路走,是选择了更难的路 DNA追溯:#龍芯⚡️丙午癸未己卯夬-铸文-v5.0 作者:龍芯北辰 UID9622 立场:民用层技术良知民族大义 确认码:#CONFIRM&#x1f30…

2026/7/24 16:43:48阅读更多 →
Python毕设项目:基于Python的信息技术教学评价与学情分析系统设计 中学线上教学辅助与作业管理系统实现 (源码+文档,讲解、调试运行,定制等)

Python毕设项目:基于Python的信息技术教学评价与学情分析系统设计 中学线上教学辅助与作业管理系统实现 (源码+文档,讲解、调试运行,定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/24 16:43:48阅读更多 →
AWS Agentic AI安全实践:基于OWASP Top 10的云原生防护指南

AWS Agentic AI安全实践:基于OWASP Top 10的云原生防护指南

在实际 AI 应用开发中,尤其是基于 AWS 这类云平台构建智能代理系统时,安全往往是最容易被忽视却又至关重要的环节。OWASP 作为全球 Web 应用安全领域的权威组织,近期发布的 Agentic AI Top 10 项目,正是为了应对 AI 代理在自主决策…

2026/7/24 16:43:48阅读更多 →
PTA基础编程题目集 7-2然后是几点(C语言实现)

PTA基础编程题目集 7-2然后是几点(C语言实现)

题目描述摘要:本题要求编写程序,根据四位数字格式的起始时间(小时无前导零)和可能为负的流逝分钟数,计算同日内的终止时间。核心思路是先解析起始时间的小时与分钟,统一转换为总分钟后再加流逝时间&#xf…

2026/7/24 16:41:48阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 0:58:53阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 0:58:53阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 0:58:53阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:06阅读更多 →
【LeetCode 54】螺旋矩阵

【LeetCode 54】螺旋矩阵

问题描述: 解法: 1、模拟(参考自【LeetCode 54】螺旋矩阵-CSDN博客) int *spiralOrder(int **matrix, int matrixSize, int *matrixColSize, int *returnSize) {static const int dirs[4][2] {{0, 1}, {1, 0}, {0, -1}, {-1, …

2026/7/24 0:00:06阅读更多 →
2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

2026 WAIC:模型隐身、智能体疯野,厂商竞赛聚焦办公场景与商业闭环

知春路不相信模型领先今年WAIC大会,昔日AI六小龙来了五家,分别是Kimi、阶跃星辰、Minimax、百川智能、零一万物。连放弃基模的百川和零一万物都来了,唯一缺席的竟是近几个月来风光无限的智谱。(DeepSeek一直不参加)WAI…

2026/7/24 0:00:06阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/23 22:58:43阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/23 18:58:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/23 18:58:18阅读更多 →