惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

MyScale Blog
MyScale Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
罗磊的独立博客
博客园 - 叶小钗
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
美团技术团队
酷 壳 – CoolShell
酷 壳 – CoolShell
雷峰网
雷峰网
宝玉的分享
宝玉的分享
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
爱范儿
爱范儿
小众软件
小众软件
K
Kaspersky official blog
P
Proofpoint News Feed
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
V
Vulnerabilities – Threatpost
博客园_首页
Microsoft Security Blog
Microsoft Security Blog
C
Cybersecurity and Infrastructure Security Agency CISA
V
V2EX
C
Check Point Blog
S
Schneier on Security
P
Palo Alto Networks Blog
IT之家
IT之家
GbyAI
GbyAI
T
Threat Research - Cisco Blogs
Hugging Face - Blog
Hugging Face - Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Apple Machine Learning Research
Apple Machine Learning Research
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tailwind CSS Blog
Project Zero
Project Zero
Y
Y Combinator Blog
V
Visual Studio Blog
Simon Willison's Weblog
Simon Willison's Weblog
T
Threatpost
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
S
Securelist
C
CERT Recently Published Vulnerability Notes
A
Arctic Wolf
M
MIT News - Artificial intelligence
人人都是产品经理
人人都是产品经理

博客园 - DoubleLi

Git 自动添加 git 子模块(.gitmodules) 如何在gitlab中使用子模块 CMake应用:模块化及库依赖 聊聊git push到远程服务器出现RPC failed问题 Qt Create多核编译配置 VS+QT生成的exe文件所依赖的dll文件和路径 vs如何发布exe并附带动态链接库dll 详解 Visual Studio、MSVC、编译器版本,看完就不再困惑啦! MobaXterm使sftp目录与terminal目录同步 从GPS/北斗模块中获取经纬度 Loguru:Python 日志终极解决方案 VsCode C++ namespace has no member错误 VS Code 提示 namespace “std“ has no member “***“ 解决方法 windows平台中使用vscode远程连接linux进行c++开发配置教程(内容详细适合小白)-2021-3-30 vscode C++ 自动补全失效 从零开始的vscode安装及环境配置教程(C/C++)(Windows系统) VScode 完全卸载并清除原有配置 vscode中 “std“ 没有成员 “round“C/C++(135) vscode 提示 namespace “std“ has no member “mutex“ 的解决方法
C++程序的发布部署方式及缺失依赖库dll的解决方法
DoubleLi · 2024-09-05 · via 博客园 - DoubleLi

主要对Windows平台上C++项目开发过程中库目录进行梳理及程序发布要注意的相关事项进行总结,希望对其他开发者有一定的借鉴意义。

1.问题的提出

在最近的项目中,主要工作是为SketcchUp平台开发基于Ruby的扩展功能库,这种库文件是以.so为后缀的形式提供,用C++语言来编写实现。当我在自己的电脑环境下测试成功无问题后,进行发布时,就需要打包自己电脑上的相关依赖dll文件。我的电脑是64位Win10操作系统,当时我直接复制了我自己电脑C:\Windows\SysWOW64目录下的dll文件,进行发布,当其它同事使用时,.so文件无法加载,于是就报了LoadError:193: %1 is not a valid Win32 application的错误。

出现此类错误的最根本原因在于,自己对于Windows系统的库文件目录理解不清,甚至理解错误,那么对于32位64位操作系统中的SystemSystem32SysWOW64这几个目录的含义与区别是什么是呢?

2.SystemSystem32SysWOW64目录的含义

对于32位操作系统:

它可以同时运行32位16位的代码程序,并且系统在如何允许32位程序和16位程序并存运行方面使用了很复杂的机制。在32位系统的Windows文件夹下,有SystemSystem32两个文件夹,分别用来存放16位32位dll文件,因此,从这方面来看,System32文件夹下存放的是32位dll文件;

对于64位操作系统:

它可以直接运行64位的程序代码,同时通过WOW64(Windows on Wondows)也能运行32位的程序代码。但是64位的操作系统有一个很大的不同,即32位代码与64位代码单独运行,有两个Program Files,有System32SysWOW64两个库文件夹,甚至有两个注册表。通常的思维,按32位系统的规律,存放64位dll的文件夹应该叫System64,但实际上,微软为了保持兼容性,64位dll依然存放在System32文件夹下,同时多了一个SysWOW64文件夹。

对于SysWOW64文件夹,这是用来适配系统运行的,因为32位软件并不能直接运行在64位系统中,故微软设计了SysWOW64,通过Wow64.dllWow64win.dllWow64cpu.dll三个dll文件进行32位64位系统的切换。

因此,在64位系统中,发布时拷贝所依赖的dll时,还是从System32文件夹下拷贝

3.C++程序的发布部署方式

对于在程序发布时,在其它电脑上运行报应用程序无法正常启动(0xc000007b),这种错误是缺少相应的dll库,解决这种错误可以将VS安装目录下的运行时库拷贝到程序的同级目录。

如我用的VS2019编译环境,64位系统,可以将

D:\VS2019\VC\Redist\MSVC\14.28.29910\x64\Microsoft.VC142.CRT 目录下的dll文件全部拷贝到程序的同级目录,如下图所示:

对于程序发布时缺少api-ms-win-crt-runtimel1-1-0.dll等文件时,这是因为目标机上未安装相应的SDK Kit,这时我们程序发布时将自己电脑上的SDK文件夹下的41个接口dll文件拷贝到程序同级目录。

如我用的S2019编译环境,SDK版本是10.0.19,可以将

C:\Program Files (x86)\Windows Kits\10\Redist\10.0.19041.0\ucrt\DLLs\x64 目录下的dll文件全部拷贝到目标程序的同级目录,如下图所示:

我们在发布程序时,一般会将上面提到的两个目录中的全部dll文件拷贝到目标程序的同级目录中,一同发布,以防止客户目标机上未安装对应的环境,导致目标程序无法运行

另外一种发布方式是,在发布目录程序时,可以将VS安装目录下的vcredist_x64.exe,一同发布,用户在使用程序时,可以先运行安装对应的库文件,再使用目标程序。

如我使用的VS2019编译环境,可以将D:\VS2019\VC\Redist\MSVC\v142目录下的文件一同发布,如下图所示:

总之,在发布自己开发的程序时,一定要注意依赖的dll的版本问题,各个dll的位数一定要匹配,否则会出现找不到dll而报各种各样的错误。