[初]静态链接和动态链接的一些问题

静态链接与动态链接 C/C++中的静态链接与动态链接详解。 阅读详情

静态链接和动态链接的一些问题

 

参考资料:

1 <<c&c++深度探索>>

2 http://www.graphics.net.cn/document/vc/003/348.asp

 

 

为什么要生成动态链接?

    静态链接有两个特点:

    l链接后产生的可执行文件包含了所有需要调用的函数的代码,因此占用磁盘宁

间较大;

    2如果有多个(调用相同库函数的)进程在内存中间时运行,内存中就存有多份

相同的库函数代码,因此占用内存空间较多。

    动态链接就是为了解决这些问题而诞生的技术。顾名思义,动态链接的意思就是在程

序装载入内存的时候才真正把库函数代码链接进来确定它们的地址,并且就算有多个程

序运行,内存也只存在一份函数代码。

 

 

Linux如何生成动态库?

/* Example code   main.c */

int fun(void);

int main(void)

{

      fun():

      return 0;

}

/* Example code   fun.c */

int fun(void)

{

      return 0;

}

 

 

 

这里有两个C文件,其中,我们要把包含fun函数的那个文件编译成PIC,放到动态库里去:

$gcc -c -fPIC fun.c

$gcc -shared -o libfun.so fun.o  <-----就是这行代码

然后:

$gcc main.c -L. –lfun

生成a.out

 

这时已经成功生成可执行文件,不过,要使系统能够使用动态库,必须让系统知道放置动态库的位置,

最简单的办法是设置LD_LIBRARY_PATH环境变量(在window底下是LIBRARY_PATH)

 

动态库的两个相关概念?

   1静态绑定(static blnding)

    使用静态绑定的程序在一开始载入内存的时候,载入程序就会把程序所有调用到的

动态代码的地址算出、确定下来。这种方式使程序刚运行时的初始化时间较长,不过一

但完成动态装载,程序的运行速度就很快。

    2动态绑定(dynamic binding)

    使用这种方式的程序并不在一开始就完成动态链接,而是直到真正调用动态库代码

时,载入程序才计算(被调用的那部分)动态代码的逻辑地址,然后等到某个时候,程

序又需要调用另外某块动态代码时,载入程序才又去计算这部分代码的逻辑地址。所以,

这种方式侄程序初始化时间较短,但运行期间的性能比不上静态绑定的程序。

 

 

Linux下如何生成静态库?

两个命令gcc和ar

gcc -c filename1.c

ar -r libabc.a filename1.o

 

/* Example code 13-01, file name: 1301.c */

 

extern int global;

 

void f(void);

 

int main(void)

{

    f();

    ++global;

    return 0;

}

/* Example code 13-01a, file name: 1301a.c */

 

extern void g(void);

int global = 0;

void f(void) {

     printf("in the f()");

     g();

};

/* Example code 13-01b, file name: 1301b.c */

 

static int local = 1;

void g(void) { --local; }

 

1

gcc –c  1301a.c 1301b.c

生成  1301a.o 1301b.o

 

2

ar rc libtest.a 1301a.o 1301b.o

生成 libtest.a  (静态库文件名通常是libxxx.a)

 

3

gcc 1301.c –L. -ltest

生成 a.exe  (在windows平台自动生成a.exe,在类unix平台则生成a.out)

 

 

Window下的动态链接技术?

SDK编程笔记 - DLL篇
1.
动态链接之含义

在链接应用程序时常使用所谓“静态链接”的方法,即将各个目标文件(.obj)、运行时函数库(.lib)以及已编译的资源文件(.res)链接到一起,形成一个可执行文件(.exe)。使用静态链接时,可执行文件需要使用的各种函数和资源都已包含到文件中。这样做的缺点是对于多个程序都使用的相同函数和资源要重复链接到exe文件中,使程序变大、占用内存增加。 “动态链接”是将一些公用的函数或资源组织成动态链接库文件(.dll),当某个需要使用dll中的函数或资源的程序启动时(准确的说是初始化时),系统将该dll映射到调用进程的虚拟地址空间、增加该dll的引用计数值,然后当实际使用到该dll时操作系统就将该dll载入内存;如果使用该dll的所有程序都已结束,则系统将该库从内存中移除。使用同一dll的各个进程在运行时共享dll的代码,但是对于dll中的数据则各有一份拷贝(当然也有在dll中共享数据的方法)。 动态链接库中可以定义两种函数:输出函数和内部函数。输出函数可以被其他模块调用,内部函数只能被动态链接库本身调用。动态链接库也可以输出数据,但这些数据通常只被它自己的函数
所使用。

2.
动态链接的优点

→
节约内存;
→
使
应用程序“变瘦”;
→
可
单独修改动态链接库而不必与应用程序重新链接;
→
可方便
实现多语言联合编程(比如用VC++写个dll,然后在VB中调用);
→
可
将资源打包;
→
可在
应用程序间共享内存
→......

3.
关于扩展名

动态链接库的标准扩展名是dll,其他如exe,drv,fon也可作为扩展名,但只有扩展名为dll的动态链接库才能被Windows自动载入。如果使用其它扩展名的动态链接库,则调用动态链接库的程序中必须使用LoadLibrary或LoadLibraryEx载入动态链接库模块。

4.
用SDK
创建一个简单的dll文件

在VC++中
选择新建一个Win32 Dynamic-Link Library。需要建立一个c/c++ head file和一个c/c++ source file并加入工程。头文件中内容为输出函数的声明,源文件中内容为DllMain函数和输出函数的定义。下面是一个最简单的例子。

//dlldemo.h
#ifdef __cplusplus
#define EXPORT extern "C" __declspec(dllexport)
#else
#define EXPORT __declspec(dllexport)
#endif

EXPORT void CALLBACK DllFoo(void) ;

//dlldemo.c
#include <windows.h>
#include "dlldemo.h"

int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
{
return TRUE ;
}

EXPORT void CALLBACK DllFoo(void)
{
MessageBox(NULL,TEXT("This function is exported from a DLL"),TEXT("DllFoo"),MB_OK) ;
return ;
}




头文件预处理中的__declspec是微软增加的“C扩展类存储属性”(C Extended Storage-Class Attributes),它指明一个给出的实例被存储为一种微软特定的类存储属性,可以为thread,naked,dllimport或dllexport. [MSDN原文:The extended attribute syntax for specifying storage-class information uses the __declspec keyword, which specifies that an instance of a given type is to be stored with a Microsoft-specific storage-class attribute (thread, naked, dllimport, or dllexport).] 输出函数必须指明为CALLBACK。 DllMain是dll的入口点函数。也可以不写它。DllMain必须返回TRUE,否则系统将终止程序并弹出一个“启动程序时出错”对话框。 编译链接后,得到动态链接库文件dlldemo.dll和输入库文件dlldemo.lib。

5.
使用dll的
两种方式

方法一:
load-time dynamic linking
在要
调用dll的应用程序链接时,将dll的输入库文件(import library,.lib文件)包含进去。具体的做 法是在源文件开头加一句#include ,然后就可以在源文件中调用dlldemo.dll中的输出文件了。

方法二:
run-time dynamic linking
不必在
链接时包含输入库文件,而是在源程序中使用LoadLibrary或LoadLibraryEx动态的载入dll。
主要步
骤为(以demodll.dll为例):


1) typedef
函
数原型和定义函数指针。
typedef void (CALLBACK* DllFooType)(void) ;
DllFooType pfnDllFoo = NULL ;
2)
使用LoadLibrary
载入dll,并保存dll实例句柄
HINSTANCE dllHandle = NULL ;
...
dllHandle = LoadLibrary(TEXT("dlldemo.dll"));
3)
使用GetProcAddress得到dll中函
数的指针
pfnDllFoo = (DllFooType)GetProcAddress(dllHandle,TEXT("DllFoo")) ;
注意从GetProcAddress返回的指针必须转型为特定类型的函数指针
。
4)
检验函数指针,如果不为空则可调用该函数
if(pfnDllFoo!=NULL)
DllFoo() ;
5)
使用FreeLibrary卸载
dll
FreeLibrary(dllHandle) ;

使用run-time dynamic linking 比较麻烦,但有它的好处(下面讨论)。MSDN中有一篇文章DLLs the Dynamic Way讨论使用c的宏创建一个基类pDll完成以上复杂的操作,使用时只需定义一个类继承自类pDll并 对类和函数
使用宏。
以上
两种方法都要求应用程序能找到dll文件,Windows按以下顺序寻找dll文件:

1)
应用程序所在目录。
2)
当前目录。
3)Windows 9x : System
目
录; Windows 2000/NT : System32 目录
4)Windows 2000/NT
的System目录
。
5)Windows
所在目
录。
6)
环境变量path中的路径。

如果系
统不能找到dll文件,将结束调用dll的进程并弹出一个“启动程序时出错”对话框,告诉你“找 不到所需的dll文件-XXX.dll”。

6
使用
运行时的动态链接(Run-Time Dynamic Linking)有什么好处?

如果使用
载入时的动态链接(Load-Time Dynamic Linking),当dll文件丢失时,调用此dll的程序将不能运行,你将会看到一个“启动程序时出错”对话框。而如果在运行时载入dll,你有机会处理这个错误,至少可以比较“温柔”的结束程序。
如果dll改
变了,使用load-time dynamic linking的程序可能会终止,而使用run-time dynamic linking 的程序只有当调用的函数在新的dll中不存在时才会出错。

7
使用
纯资源dll

一般只在其c文件中
写一个空的DllMain,然后向工程中插入资源,最后编译为dll文件。纯资源dll没有任何输出函数,因此不会生成.lib文件,所以必须在运行时用LoadLibrary载入。

8
在dll中使用共享
数据(摘自programming windows)

// shared memory section (requires /SECTION:shared,RWS in link options)
#pragma data_seg ("shared")
int iTotal = 0 ;
WCHAR szStrings [MAX_STRINGS][MAX_LENGTH + 1] = { '/0' } ;
#pragma data_seg ()

#pragma comment(linker,"/SECTION:shared,RWS")

第一
个#pragma叙述建立资料段,这里命名为shared。您可以将这段命名为任何一个您喜欢的名字。在这里的#pragma叙述之后的所有初始化了的变数都放在shared资料段中。第二个#pragma叙述标示段的结束。对变数进行专门的初始化是很重要的,否则编译器将把它们放在普通的未初始化资料段中而不是放在shared中。 连结器必须知道有一个「shared」共享资料段。在「Project Settings」对话方块选择「Link」页面标签。选中「STRLIB」时在「Project Options」栏位(在Release和Debug设定中均可),包含下面的连结叙述: /SECTION:shared,RWS 字母RWS表示段具有读、写和共用属性。或者,您也可以直接用DLL原始码指定连结选项,就像我们在STRLIB.C那样: #pragma comment(linker,"/SECTION:shared,RWS")

the end

参考资料:http://www.graphics.net.cn/document/vc/003/348.asp

 

 

动态链接库的一些名词

参考资料:

http://blog.youkuaiyun.com/gofishing/archive/2006/05/09/715052.aspx

1、什么是动态链接库?
它不是应用程序,不能直接运行,也不能接收消息。dll是一系列函数的集合,可以简单理解为把一些函数放到了一个文件里面,这些函数可以被其它程序和dll调用。一个dll可以同时被几个程序或其它dll调用,这应该是它的特点。
2、windows api与dll
windows api中的所有函数均包含在dll中,当然不会是一个dll。其中最为重要的3个windows api的dll文件是:Kernel32.dll 主要是管理内存、进程和线程的函数的集合;User32.dll 执行用户界面的任务的函数(比如:窗口的创建销毁放大缩小、消息的传递等等与用户相关的操作);GDI32.dll 包含用于画图和显示文本的各个函数;
3、静态库和动态库
静态库是把程序运行时需要使用的函数编译在一个二进制文件中,扩展名为.lib。当程序link时把静态库中的二进制数据和程序其它数据放到一起。程序运行时不在需要lib和dll文件的支持。这样做的坏处是开发出来的程序占用磁盘空间较大。特别是windows系统中本来就有或很多程序运行都需要的函数完全没有必要每次开发程序时都要使用各自的静态库。
而动态库在开发时仅是把dll中的函数名和参数放到应用程序中,应用程序运行时根据函数名和参数调用dll中的函数来运行,这样操作系统中的应用程序可以同时使用同一个dll。可以有效地节省硬盘空间,当然这样做使得程序设计更有层次。也有利于软件工程师的分工和信息安全。
4、引入库和动态库
引入库和动态库是成对出现的,在编译dll的时候会同时产生一个引入库,扩展名为lib。lib中仅含有dll中的函数名和参数,真正的函数体在动态库中。两个的关系大概相当于.h和.cpp文件之间的关系。在编写程序的过程中
5、引入库和静态库
引入库和静态库的扩展名均为*.lib,但是引入库仅包含一些函数名和参数信息,没有函数体,是为调用动态库服务的,它和动态库的关系相当于.h文件和.cpp文件之间的关系;

静态链接,动态链接和strip 缘起如果你自己折腾linux的话,肯定碰到过当你编译安装一些软件时,要求所依赖的某个共享库必须以PIC方式来编译的问题,我遇到过,还遇到过很多次。不是很明白这个PIC是什么。自己一直也没有很系统的去研究这个问题,知道几年前碰到了《程序员的自我修养》这本书。这本书讲的实在不错。不过看完之后,感觉自己懂了,但是又好像没懂。让自己说,又说不出来什么。所以看了一遍之后,就把这本书放到了一边,直到最近,又拿起 阅读详情

相关推荐

C语言 | 什么是动态链接与静态链接?

什么是链接? 对于初学C语言的朋友,可能对链接这个概念有点陌生,这里简单介绍一下。我们的C代码编译生成可执行程序会经过如下过程: 链接就是把目标文件与一些库文件生成可执行文件的一个过程。关于更详细的编译过程,可查阅往期笔记:C语言的编译过程 静态、动态链接? 1、什么是静态链接? 静态链接是由链接器在链接时将库的内容加入到可执行程序中的做法。链接器是一个独立程序,将一个或多个库或目标文件(先前由...

嵌入式大杂烩 4381

动态链接库的一些名词

1、什么是动态链接库?它不是应用程序,不能直接运行,也不能接收消息。dll是一系列函数的集合,可以简单理解为把一些函数放到了一个文件里面,这些函数可以被其它程序和dll调用。一个dll可以同时被几个程序或其它dll调用,这应该是它的特点。2、windows api与dllwindows api中的所有函数均包含在dll中,当然不会是一个dll。其中最为重要的3个windows api的dll文件是

太郎之石的专栏 1567

文件快速拷贝动态链接库:高效代码共享与文件管理

本文还有配套的精品资源,点击获取 简介:动态链接库(DLL)是IT领域的重要资源,能够实现代码和数据的共享,以减少内存占用和提升系统效率。本动态链接库专门设计用于高效的文件拷贝,拥有独特的文件过滤功能和多线程技术,使得文件操作更快捷、方便。开发者可以通过编程接口(API)调用,实现对文件拷贝过程的精确控制,提高拷贝速度并优化文件管理任务。 1. 动态链接库(DLL...

weixin_42600407的博客 1203

解决无法定位程序输入点与动态链接库api-ms-win-crt-runtime-l1-1-0.dll

1.升级了yy8.36之后,发现录完歌之后无法直接在悬浮窗上点击播放调用系统播放器提示"无法定位程序输入点ucrtbase.abort与动态链接库api-ms-win-crt-runtime-l1-1-0.dll上"于是从网上下载了一个api-ms-win-crt-runtime-l1-1-0.dllregsvr32 注册了一下该dll,提示与系统版本不匹配。这个dll应该是不区分32/64位的,...

w55100的博客 4万+

动态链接库的构建与使用

本文详细介绍了在GNU/Linux环境下,如何构建和使用动态链接库(DLLs),包括传统静态库、共享库以及动态加载库的创建和应用。文章通过示例代码解释了动态链接库API的使用,展示了如何使用dlopen打开库文件,dlsym获取函数指针,以及dlclose关闭库文件。此外,还介绍了相关的实用工具如file, size, nm, objdump和ranlib的使用,以帮助开发者更好地理解和操作库文件。

weixin_28487725的博客 492

vc使用动态链接库和API编程

vc使用动态链接库和API函数编程。以文档ppt形式变现。

静态链接和动态链接

大家都知道,一段程序的编译全过程,也就是程序运行的四个阶段,分为,不清楚的可以看我之前写的文章,。我在这里简单讲一下链接的概念,参考黑皮书《深入理解计算机系统》(csapp),现在有一个简单的hello程序,这个程序经过之后生成可重定位目标文件(hello.o),也是一个二进制文件,,假如hello程序调用了printf函数,它是每个C编译器都提供的标准C库中的一个函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须以某种方式合并到我们的hello.0程序中。

Happy learning and coding journey! 5545

易康eCognition9.0分类|规则集和机器学习的方法的面向对象的多尺度分割分类

基于易康eCognition9.0软件的规则集和机器学习的方法的面向对象的多尺度分割分类

weixin_46493028的博客 1万+

【计算机基础】静态链接与动态链接

本文介绍了静态链接和动态链接。

weixin_44211968的博客 1万+

Windows 10 下 DockerToolbox 安装全攻略:从下载到配置阿里云镜像加速

本文详细介绍了在Windows 10系统上安装和配置DockerToolbox的完整流程。从下载安装包、执行初步安装,到关键步骤——修改虚拟机存储路径以及配置阿里云镜像加速器,旨在帮助开发者,尤其是初次接触Docker的新手,快速搭建高效的本地容器开发环境,并解决国内镜像下载缓慢的痛点。

moon9的博客 476

VM与欧姆龙PLC通讯设置实战:Fins TCP/UDP协议详解

本文详细解析了VM(VisionMaster)与欧姆龙PLC通过Fins TCP/UDP协议进行通讯的实战设置。内容涵盖网络配置、协议选择(TCP可靠性与UDP实时性)、VM端地址映射与数据点添加、以及数据接收解析流程,并提供了常见错误排查与高级调试技巧,帮助视觉与自动化工程师快速实现稳定可靠的工业通讯集成。

weixin_29172963的博客 327

深入浅出静态链接和动态链接

        作为一名C/C++程序员,对于编译链接的过程要了然于胸。首先大概介绍一下,编译分为3步,首先对源文件进行预处理,这个过程主要是处理一些#号定义的命令或语句(如宏、#include、预编译指令#ifdef等),生成*.i文件;然后进行编译,这个过程主要是进行词法分析、语法分析和语义分析等,生成*.s的汇编文件;最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可...

kang___xi的博客 9万+

PVE 8.0 保姆级换源教程:从Debian到LXC仓库,一次搞定国内镜像(附弹窗去除)

本文提供PVE 8.0保姆级换源教程,涵盖从Debian基础源到LXC仓库的国内镜像配置,并附赠去除订阅弹窗的实用技巧。通过详细步骤和命令示例,帮助用户快速优化ProxmoxVE环境,提升下载速度并消除干扰提示,适用于虚拟化平台的高效管理。

weixin_33282146的博客 412

静态链接库和动态链接库

一、静态链接库和动态链接库 1、制作方法 2、动态库制作中extern “C” _declspec(dllexport)导出,才会生成lib文件 3、查看动态库生成的接口 二、静态链接和动态链接 1、静态库的链接 2、动态库的链接 1)LoadLibrary、GetProcAddress、FreeLibrary 2)导出lib的动态库可根据lib和头文件隐式链接 三、 #ifdef TESTDLL_EXPORTS #define TESTDLL_API __declspec(dllexport) #else

qq_43148810的博客 4934

基于NARX和NARX-LSTM的模型辨识与MPC控制系统调试与优化

本文针对两输入单输出非线性系统,提出基于NARX和NARX-LSTM的模型辨识与MPC控制优化方案。系统输入为固定量u1和可调量u2(8.5-140),输出目标为-0.58。现有模型存在辨识精度不足、历史输出依赖过重、预测偏差等问题。解决方案包括:数据差分处理改善非平稳性、调整延迟阶数优化模型结构、引入注意力机制替代手动加权、改进损失函数消除预测偏差。MPC控制器将结合优化模型,考虑控制变量步长约束(≥2),实现输出稳定控制。通过系统性的模型调试与控制算法优化,最终形成完整的非线性系统辨识与控制框架。

huanghm88的专栏 128

Python爬虫教程:抓取Android或iOS应用中的数据

随着智能手机的普及,移动应用程序已经成为我们生活中不可或缺的一部分。从社交媒体、在线购物到金融服务和健康管理,几乎所有领域都有相应的手机应用程序(App)服务用户。而这些应用程序通常会存储大量的数据,例如用户行为、产品信息、订单记录等。如果我们能有效地抓取这些数据,可以为数据分析、商业智能、用户行为分析等提供有力支持。本文将重点介绍如何使用Python爬虫技术抓取Android或iOS应用中的数据,尤其是如何从这些应用的后端接口、存储、或网页中提取数据。我们将探讨如何通过反向工程技术访问移动应用中的API接

2201_76125261的博客 801

静态链接和动态链接区别

1.静态链接与动链接的区别 在C语言中,我们知道要生成可执行文件,必须经历两个阶段,即编译、链接。 在编译过程中,只有编译,不会涉及到链接。 在链接过程中,静态链接和动态链接就出现了区别。静态链接的过程就已经把要链接的内容已经链接到了生成的可执行文件中,就算你在去把静态库删除也不会影响可执行程序的执行;而动态链接这个过程却没有把内容链接...

请叫我皮皮虾的博客 2万+

农作物生长模型:数学建模与实战案例

在本篇博客中,我们介绍了农作物生长模型的基本原理,并结合Matlab代码和实战案例,演示了如何应用数学建模技术进行农作物生长模型的研究与应用。农作物生长模型在农业领域具有重要意义,希望本篇博客能帮助读者更好地理解农作物生长模型的原理和应用,并在实际农业生产中取得更好的效果。

YOLO 2734

动态链接和静态链接

对于c和c++程序员,对于编译链接的过程要了然于胸,编译过程:预编译、编译、汇编、链接。动态链接和静态链接属于其链接部分的方式。 编译分为三步 1. 首先对源文件进行预处理。(如宏、#include、预编译指令#ifdef等) 生成.i文件,这个过程也叫做预编译(Processing) 2.然后进行编译,这个过程主要是进行词法分析、语法分析和语义分析等,生成.s的汇编文件; 3.最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可重定位的二进制目标文件。生成.o文件 现代..

Bobowen的博客 2321

ZYNQ BRAM实现PS与PL数据交互

有时CPU需要与PL进行小批量的数据交换,可以通过BRAM模块,也就是Block RAM实现此要求。本章通过Zynq的GP Master接口读写PL端的BRAM,实现与PL的交互。在本实验中加入了自定义的FPGA程序,并利用AXI4总线进行配置,通知其何时读写BRAM。以下为本实验原理图,CPU通过AXI BRAM Controller读取BRAM数据,CPU仅配置自定义的PL BRAM Controller 的寄存器,不通过它读写数据。

baidu_34971492的博客 2276

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

动态链接和静态链接区别

你是否知道引用的那些头文件中的函数是怎么被执行的呢?这就要牵扯到链接库了!!!   库有两种,一种是静态链接库,一种是动态链接库,不管是哪一种库,要使用它们,都要在程序中包含相应的include头文件。我们先来回顾一下程序编译的过程。如下图: 静态链接: 静态连接库就是把 (lib) ⽂件中⽤到的函数代码直接链接进⽬标程序,程序运⾏的时候不再需要其它的库⽂件; 静态链接的优缺点: 静态链接的缺点很明显,一是浪费空间,因为每个可执行程序中对所有需要的目...

居老师的博客 2046

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

静态链接库和动态链接库的区别

目录 1、链接库概述 2、静态链接库 2.1、编辑测试文件 2.2、将.c 编译生成 .o文件 2.3、由 .o 文件创建.a静态库 2.4、在程序中使用静态库 2.5、生成目标程序main,然后运行 3、动态库(隐式链接) 3.1、由 .o创建.so动态库 3.2、隐式方式使用动态库 3.3、动态库的初始化和解析 1、动态库的构造和析构函数机制 2、全局变量初始化 4.........

weixin_36670529的博客 4372

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

上一篇: MinGW
下一篇: QTOpia中文化
飞羽飞之猪
博客等级 码龄21年 127粉丝 85原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值