Ronan Blog

罗华东的博客 | 永远相信美好的事情即将发生

静态库与动态库

2024-09-02 Docs Ronan

不管是Linux还是Windows中的库文件其本质和工作模式都是相同的, 只不过在不同的平台上库对应的文件格式和文件后缀不同。程序中调用的库有两种静态库动态库,不管是哪种库文件本质是还是源文件,只不过是二进制格式只有计算机能够识别,作为一个普通人就无能为力了。

在项目中使用库一般有两个目的,一个是为了使程序更加简洁不需要在项目中维护太多的源文件,另一方面是为了源代码保密,毕竟不是所有人都想把自己编写的程序开源出来。

当我们拿到了库文件(动态库、静态库)之后要想使用还必须有这些库中提供的API函数的声明,也就是头文件,把这些都添加到项目中,就可以快乐的写代码了。

1.静态库

在Linux中静态库由程序 ar 生成,现在静态库已经不像之前那么普遍了,这主要是由于程序都在使用动态库。关于静态库的命名规则如下:

  • 在Linux中静态库以lib作为前缀, 以.a作为后缀, 中间是库的名字自己指定即可, 即: libxxx.a
  • 在Windows中静态库一般以lib作为前缀, 以lib作为后缀, 中间是库的名字需要自己指定, 即: libxxx.lib

1.1生成静态链接库

生成静态库,需要先对源文件进行汇编操作 (使用参数 -c) 得到二进制格式的目标文件 (.o 格式), 然后在通过 ar工具将目标文件打包就可以得到静态库文件了 (libxxx.a)。

使用ar工具创建静态库的时候需要三个参数:

  • 参数c:创建一个库,不管库是否存在,都将创建。
  • 参数s:创建目标文件索引,这在创建较大的库时能加快时间。
  • 参数r:在库中插入模块(替换)。默认新的成员添加在库的结尾处,如果模块名已经在库中存在,则替换同名的模块。

img

生成静态链接库的具体步骤如下:

1.需要将源文件进行汇编, 得到 .o 文件, 需要使用参数 -c

# 执行如下操作, 默认生成二进制的 .o 文件
# -c 参数位置没有要求
$ gcc 源文件(*.c) -c
# 提示头文件找不到, 添加参数 -I 重新头文件路径即可
gcc 源文件(*.c) -c -I /path/

2.将得到的 .o 进行打包, 得到静态库

$ ar rcs 静态库的名字(libxxx.a) 原材料(*.o)

3.发布静态库

Continue reading

JavaScript

2024-09-02 Docs Ronan

对象概述

什么是对象?对象(object)是 JavaScript 语言的核心概念,也是最重要的数据类型

简单说,对象就是一组“键值对”(key-value)的集合,是一种无序的复合数据集合

img

var user = {
  name: 'itbaizhan',
  age: '13'
};

对象的每一个键名又称为“属性”(property),它的“键

值”可以是任何数据类型。如果一个属性的值为函数,通常把这个属性称为“方法”,它可以像函数那样调用

var user = {
  getName: function (name) {
    return name;
  }
};
user.getName("itbaizhan") // itbaizhan

如果属性的值还是一个对象,就形成了链式引用

var user = {
    name:"itbaizhan",
    age:13,
    container:{
        frontEnd:["Web前端","Android","iOS"],
        backEnd:["Java","Python"]
    }
}
user.container.frontEnd // ["Web前端","Android","iOS"]

Math对象

Math是 JavaScript 的原生对象,提供各种数****学功能。

Math.abs()

Math.abs方法返回参数值的绝对值

Math.abs(1) // 1
Math.abs(-1) // 1

Math.max(),Math.min()

Math.max方法返回参数之中最大的那个值,Math.min返回最小的那个值。如果参数为空, Math.min返回Infinity, Math.max返回-Infinity

Math.max(2, -1, 5) // 5
Math.min(2, -1, 5) // -1
Math.min() // Infinity
Math.max() // -Infinity

Math.floor(),Math.ceil()

Math.floor方法返回小于参数值的最大整数

Math.floor(3.2) // 3
Math.floor(-3.2) // -4

Math.ceil方法返回大于参数值的最小整数

Math.ceil(3.2) // 4
Math.ceil(-3.2) // -3

Math.random()

Math.random()返回0到1之间的一个伪随机数,可能等于0,但是一定小于1

Continue reading

「Python」异常处理

2024-09-02 Docs Ronan

在 Python 中,常见的基本错误有两类,即语法错误和异常。对于语法错误,应该在程序编写过程中尽量予以避免,在程序调试中消除。而异常是 Python 程序在运行过程中引发的错误,如果程序中引发了未进行处理的异常,程序就会由于异常而终止运行,只有为程序添加异常处理,才能使程序更具健壮性。

1.语法错误

语法错误是所有编程语言中都存在的一种常见错误,即程序的洗发不符合编程语言的规定。常见的语法错误有:

  1. 拼写错误(SyntaxError、NameError),即 Python 语言中的关键字写错,变量名,函数名拼写错误等。
  2. 脚本程序不符合 Python 的语法规范,例如少了括号,冒号等,以及表达式书写错误等。
  3. 缩进错误,因为 Python 语法规定,以缩进作为程序的语法之一。一般来说,Python 标准的缩进是以 4 个空格或一个 Tab 作为一个缩进,但同一个程序或项目中应该统一使用同一种缩进风格。

2.异常处理

异常是 Python 程序在运行过程中引发的错误。如果程序中引发了未进行处理的异常,脚本就会由于异常而终止运行。只有在程序中捕获这些异常,并进行相关的处理,才能使程序不会中断运行。

Python 中使用 try...except 语句来说处理异常,基本形式如下:

try:
	'语句'	 # 可能产生异常的语句
except	'异常名 1'	# 要处理的第一类异常
	'语句'	 # 异常的处理语句
except	'异常名 1'	# 要处理的第二类异常
	'语句'	 # 异常的处理语句
else:		  
	'语句'     # 未触发异常,则执行该语句
finally:	  
	'语句'     # 始终执行该语句,一般为了达到释放资源等目的

注意:else 语句在未引发异常情况下得到运行。

首先,我们先演示一个最简单的案例:

# 函数名错误, print 误写成 printt
printt(1)
print(2)

运行结果:

NameError: name 'printt' is not defined

使用异常捕获

try:
    # 函数名错误, print 误写成 printt
    printt(1)
except:
    print('捕获到了异常')

print(2)

注意:

Continue reading
Older posts Newer posts