首页 > 编程语言 >C++程序的发布部署方式及缺失依赖库dll的解决方法

C++程序的发布部署方式及缺失依赖库dll的解决方法

时间:2024-09-05 15:14:53浏览次数:5  
标签:32 程序 C++ 缺失 文件夹 64 dll 目录

主要对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而报各种各样的错误。

标签:32,程序,C++,缺失,文件夹,64,dll,目录
From: https://www.cnblogs.com/lidabo/p/18398486

相关文章

  • C++ 使用终端GDB调试复杂项目中Segmentation Fault 和 std::bad_alloc问题
            近期在公司虚拟机上写代码遇到SegmentationFault和std::bad_alloc问题,但是项目庞大,在不了解功能、代码连接关系的时候很难追踪具体是什么地方出了问题。网络上许多关于GDB的教程仅仅停留在简单的示例中的调试,对于复杂的项目结构(多文件,多作用域,......)来说显......
  • C++(for)
    目录1.经典的for循环2.基于范围的for循环(C++11引入)3.无限for循环4.嵌套for循环5.使用continue和break控制循环流总结C++中有多种形式的for循环,每种形式适合不同的应用场景。1.经典的for循环这是C++中最基础的循环类型,由三部分组成:初始化、条件、......
  • C++ 模板(函数模板)
    模板模板介绍C++提供了函数模板(functiontemplate)。所谓函数模板。实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡事函数体相同的函数都可以使用这个模板代替,不必定义多个函数,只需在模板中定义一次即可。在调......
  • C++: std::once_flag 和 std::call_once
    std::once_flag和std::call_oncestd::once_flag和std::call_once是C++11引入的同步原语,用于确保某个函数在多线程环境中只被执行一次。它们位于头文件中,主要用于实现线程安全的初始化操作。std::once_flag概述类型:std::once_flag是一个结构体,用于记录某个函数......
  • C++ 原子变量atomic variable
    原子变量原子变量(atomicvariable)是C++11引入的一种同步机制,用于在多线程环境中进行无锁的、线程安全的操作。原子变量的操作是不可分割的,即在执行过程中不会被其他线程中断,从而避免了数据竞争和不一致的问题。原子变量位于头文件中。基本概念原子性原子性:一个操作是......
  • C++和Python混合编程——C++调用Python入门
    大纲代码结构初始化Python解释器获取GIL为什么需要GIL?GIL的影响导入Python模块并执行代码释放GIL终止Python解释器完整代码编译执行结果项目地址在《C++和Python混合编程——Python调用C++入门》一文中,我们熟悉了Python调用C++编译的动态库的方法。但是作......
  • C++11新特性
    C++11主要新特性有类的初始化与函数、新增关键字、std库新特性、lambda表达式、智能指针、线程1.关键字()nullptr取代NULL、0()constexpr:显式声明函数返回值、变量是一个常量表达式()auto:对变量类型推导,()decltype:对表达式类型推导,用法为decltype(表达式)()using:声明使用的命......
  • C++高精度乘法
    #include<iostream>#include<string>#include<cstring>usingnamespacestd;intmain(){stringstr1,str2;cin>>str1>>str2; //确定字符串长度 intlen1=str1.length(); intlen2=str2.length(); //确认积......
  • VS+QT生成的exe文件所依赖的dll文件和路径
    <divid="content_views"class="htmledit_views"><h2id="articleContentId"><aname="t0"></a>vs2017+Qt5.13.2程序打包</h2>step1打开vs2017,选中项目:选择release模式选择发布模......
  • 编译原理项目——C++实现C语言编译器输出为gcc级汇编(代码/报告材料)
    完整的代码材料见文章末尾以下为核心内容和部分结果项目介绍function.cpp实现了共有的函数lexer.cpp词法分析器get_predict_table.cpp获取预测分析表LR.cpp语法分析generate.cpp语义分析中间代码生成to_asm.cpp目标代码生成部分核心代码LR分析#include"co......