diff --git a/01/01.ass b/01/01.ass index 82f3f92b..0c00c87b 100644 --- a/01/01.ass +++ b/01/01.ass @@ -51,7 +51,7 @@ Dialogue: 0,0:02:57.58,0:03:00.99,Default,,0,0,0,,这是我用 Blender 创建的 Dialogue: 0,0:03:01.30,0:03:06.84,Default,,0,0,0,,然后用 taichi_blend 内置的渲染器渲染出来的结果 Dialogue: 0,0:03:08.41,0:03:11.17,Default,,0,0,0,,这是视窗里显示的结果 Dialogue: 0,0:03:11.54,0:03:14.07,Default,,0,0,0,,可以看到这是一个方的灯 -Dialogue: 0,0:03:14.87,0:03:17.15,Default,,0,0,0,,照着这个康奈尔的箱子 +Dialogue: 0,0:03:14.87,0:03:17.15,Default,,0,0,0,,照着这个康奈尔的箱子(Cornell box) Dialogue: 0,0:03:18.77,0:03:20.78,Default,,0,0,0,,他还是有一点噪音 Dialogue: 0,0:03:20.80,0:03:23.10,Default,,0,0,0,,但是他收敛的很快 Dialogue: 0,0:03:25.00,0:03:29.77,Default,,0,0,0,,我目前是在开发 Zeno 节点仿真 @@ -77,44 +77,94 @@ Dialogue: 0,0:04:46.99,0:04:50.16,Default,,0,0,0,,那那我要把它关了是吗 Dialogue: 0,0:04:52.20,0:04:53.66,Default,,0,0,0,,那我关了 Dialogue: 0,0:04:56.43,0:04:57.26,Default,,0,0,0,,关了? Dialogue: 0,0:05:00.04,0:05:01.70,Default,,0,0,0,,那那我关了 -Dialogue: 0,0:05:03.43,0:05:08.33,Default,,0,0,0,,今天的介绍是是关于编译器 +Dialogue: 0,0:05:03.43,0:05:08.33,Default,,0,0,0,,今天的介绍是关于编译器 Dialogue: 0,0:05:08.55,0:05:10.97,Default,,0,0,0,,因为要讲 CMake -Dialogue: 0,0:05:11.18,0:05:15.65,Default,,0,0,0,,CMake 就是用来编译一个程序的 +Dialogue: 0,0:05:11.18,0:05:15.65,Default,,0,0,0,,CMake 是用来编译一个程序的 Dialogue: 0,0:05:17.56,0:05:20.16,Default,,0,0,0,,他到底要做什么呢? -Dialogue: 0,0:05:20.29,0:05:22.04,Default,,0,0,0,,他的目的就是 +Dialogue: 0,0:05:20.29,0:05:22.04,Default,,0,0,0,,他的目的是 Dialogue: 0,0:05:22.30,0:05:28.49,Default,,0,0,0,,把一个 cpp 原文件编译成这个可执行文件 Dialogue: 0,0:05:31.49,0:05:34.49,Default,,0,0,0,,这个编译器还分很多种 Dialogue: 0,0:05:35.43,0:05:40.91,Default,,0,0,0,,目前主流的是 Linux 上的 GNU 系列 Dialogue: 0,0:05:41.28,0:05:46.02,Default,,0,0,0,,还有 LLVM 家生产的 Clang 系列 -Dialogue: 0,0:05:46.87,0:05:54.75,Default,,0,0,0,,还有思维软件生产的MSVC系列,然后他们各自对应的命令行程序如下 -Dialogue: 0,0:05:54.75,0:06:03.98,Default,,0,0,0,,然后我们这里因为要编译 C++ ,所以就不是用的GCC,而是 g++ 了 -Dialogue: 0,0:06:03.98,0:06:07.99,Default,,0,0,0,,这样它会链接一些 C++ 类库 -Dialogue: 0,0:06:08.39,0:06:19.39,Default,,0,0,0,,如果用GCC编译命令CPP的话,它到时候链接的时候会说找不到那个 C++ 的什么 -Dialogue: 0,0:06:19.72,0:06:27.21,Default,,0,0,0,,那关了好多了吧 -Dialogue: 0,0:06:27.21,0:06:32.11,Default,,0,0,0,,然后我们编译完之后就可以运行 -Dialogue: 0,0:06:32.11,0:06:35.61,Default,,0,0,0,,就是我这里是有案例 -Dialogue: 0,0:06:36.77,0:06:48.35,Default,,0,0,0,,首先我们用 g++ V点CTP杠O a.out,然后然后就可以看到生成 a.out -Dialogue: 0,0:06:48.35,0:07:05.71,Default,,0,0,0,,然后我们另一点cpp也是这里面有一个 printf ,然后顺便说一下,就是 C++ 的CSTDIO和C语言的STDIO有什么区别呢? -Dialogue: 0,0:07:06.65,0:07:11.98,Default,,0,0,0,,就是C语言它只会提供这个,但不会提供这个 -Dialogue: 0,0:07:11.98,0:07:20.68,Default,,0,0,0,,如果我们用 C++ 的话,它前面就有一个STD前缀也可以用,就这点区别 -Dialogue: 0,0:07:21.01,0:07:46.66,Default,,0,0,0,,然后我们还可以去看一看生成这个 a.out 它里面到底是什么呀,我们可以搜索一下,可以看到它这里面就是一个幂函数,然后幂函数可以看到它进来,先是做了一些压站 -Dialogue: 0,0:07:46.66,0:08:05.93,Default,,0,0,0,,然后它调用了 puts 即使 printf 它最后也会被优化成 puts 因为我没有格式化嘛,所以它就变成 puts 这个 printf hello puts hello world,然后这个 puts 又是什么呢? -Dialogue: 0,0:08:05.93,0:08:14.96,Default,,0,0,0,,可以看到port s 的,它只是跳转到了某一个地址,然后这个地址又是什么呢? -Dialogue: 0,0:08:14.96,0:08:23.70,Default,,0,0,0,,它其实是一个相对地址,而这个地址这个函数定义的位置其实是在 -Dialogue: 0,0:08:28.76,0:08:45.37,Default,,0,0,0,,可以看到他的电影位置,其实在这个文件里,你看他其实是在这个软件里实现的 -Dialogue: 0,0:08:45.37,0:08:49.68,Default,,0,0,0,,那他们为什么能够相互之间调用呢? -Dialogue: 0,0:08:50.01,0:09:00.78,Default,,0,0,0,,就因为它在编译的时候啊,它会自动链接上 libc 所以它可以调用到 libc 里的那个函 -Dialogue: 0,0:09:01.23,0:09:05.00,Default,,0,0,0,,这就是动态链接库 -Dialogue: 0,0:09:07.00,0:09:20.12,Default,,0,0,0,,对呀,这里面是汇编语言,这是一个把那个就是编译器不是生成机器码嘛 -Dialogue: 0,0:09:20.12,0:09:31.59,Default,,0,0,0,,然后OBJdump 这个程序,它可以把机器码反汇编成那个汇编语言就可以看得懂了 -Dialogue: 0,0:09:31.59,0:09:39.36,Default,,0,0,0,,然后less 是让它可以上下滚动,不加less 的我就难以滚动了 -Dialogue: 0,0:09:39.36,0:09:51.58,Default,,0,0,0,,然后就是我们刚才只用了一个hello 文件,但有时候我们是需要多个文件的 -Dialogue: 0,0:09:51.58,0:10:05.10,Default,,0,0,0,,这时候我们其实其实是可以根据hello.cpp V.cpp a.out 也是可以的 -Dialogue: 0,0:10:05.61,0:10:15.85,Default,,0,0,0,,但是这样的话他就有一个问题,就是比如我们改了一下hello world ,把它变成below word -Dialogue: 0,0:10:15.85,0:10:24.69,Default,,0,0,0,,然后他这时候去编的话,就得全部重新编一遍,他就浪费了时间,对吧? -Dialogue: 0,0:10:24.69,0:10:43.85,Default,,0,0,0,,所以说这种情况我们可以把先把hello world 变成hello 点O当然要加一个杠C选项,表示只是暂时编译成O文件,不是 a.out 的可执行文件 -Dialogue: 0,0:10:43.85,0:10:53.85,Default,,0,0,0,,这个O呢其实里面也是已经变成汇编了,不过他不是可执行的 -Dialogue: 0,0:10:54.53,0:10:59.11,Default,,0,0,0,,如果我这样的话,他就会报错 +Dialogue: 0,0:05:46.87,0:05:51.46,Default,,0,0,0,,还有是微软家生产的 MSVC 系列 +Dialogue: 0,0:05:52.44,0:05:56.09,Default,,0,0,0,,他们各自对应的命令行程序如下 +Dialogue: 0,0:05:56.97,0:05:59.78,Default,,0,0,0,,我们这里因为要编译 C++ +Dialogue: 0,0:06:00.08,0:06:04.04,Default,,0,0,0,,所以就不是用的 gcc,而是 g++ 了 +Dialogue: 0,0:06:04.45,0:06:07.78,Default,,0,0,0,,这样它会链接一些 C++ 的库 +Dialogue: 0,0:06:08.72,0:06:12.80,Default,,0,0,0,,如果用 gcc 编译、链接 cpp +Dialogue: 0,0:06:13.31,0:06:15.92,Default,,0,0,0,,它到时候链接的时候会说 +Dialogue: 0,0:06:16.18,0:06:19.50,Default,,0,0,0,,找不到那个 C++ 的什么库 +Dialogue: 0,0:06:25.12,0:06:27.49,Default,,0,0,0,,那关了好多了吧 +Dialogue: 0,0:06:28.61,0:06:32.08,Default,,0,0,0,,我们编译完之后就可以运行 +Dialogue: 0,0:06:33.39,0:06:35.61,Default,,0,0,0,,我这里是有案例 +Dialogue: 0,0:06:37.16,0:06:43.28,Default,,0,0,0,,首先我们用 g++ main.cpp -o a.out +Dialogue: 0,0:06:46.22,0:06:48.53,Default,,0,0,0,,可以看到生成 a.out +Dialogue: 0,0:06:49.47,0:06:51.64,Default,,0,0,0,,我们 main.cpp 也是 +Dialogue: 0,0:06:51.66,0:06:54.77,Default,,0,0,0,,这里面有一个 printf +Dialogue: 0,0:06:56.72,0:06:57.97,Default,,0,0,0,,顺便说一下 +Dialogue: 0,0:06:59.04,0:07:03.97,Default,,0,0,0,,C++ 的 和 C 语言的 +Dialogue: 0,0:07:03.99,0:07:05.54,Default,,0,0,0,,有什么区别呢? +Dialogue: 0,0:07:07.65,0:07:09.87,Default,,0,0,0,,就是 C 语言它只会提供这个 +Dialogue: 0,0:07:09.89,0:07:11.35,Default,,0,0,0,,但不会提供这个 +Dialogue: 0,0:07:12.02,0:07:14.37,Default,,0,0,0,,如果我们用 C++ 的话 +Dialogue: 0,0:07:14.66,0:07:18.55,Default,,0,0,0,,它前面加一个 std:: 前缀也可以用 +Dialogue: 0,0:07:19.03,0:07:20.75,Default,,0,0,0,,就这点区别 +Dialogue: 0,0:07:23.58,0:07:28.87,Default,,0,0,0,,我们还可以去看一看生成这个 a.out +Dialogue: 0,0:07:28.89,0:07:30.92,Default,,0,0,0,,它里面到底是什么呀 +Dialogue: 0,0:07:30.95,0:07:33.27,Default,,0,0,0,,我们可以搜索一下 +Dialogue: 0,0:07:36.45,0:07:40.21,Default,,0,0,0,,可以看到它这里面是一个 main 函数 +Dialogue: 0,0:07:40.57,0:07:41.96,Default,,0,0,0,,然后 main 函数 +Dialogue: 0,0:07:42.20,0:07:46.26,Default,,0,0,0,,可以看到它进来先是做了一些压栈 +Dialogue: 0,0:07:46.29,0:07:49.18,Default,,0,0,0,,然后它调用了 puts +Dialogue: 0,0:07:49.42,0:07:54.10,Default,,0,0,0,,其实 printf 它最后也会被优化成 puts +Dialogue: 0,0:07:54.38,0:07:56.43,Default,,0,0,0,,因为我没有格式化嘛 +Dialogue: 0,0:07:56.73,0:07:59.36,Default,,0,0,0,,所以它就变成 puts +Dialogue: 0,0:07:59.39,0:08:01.78,Default,,0,0,0,,这个 printf hello +Dialogue: 0,0:08:01.80,0:08:03.56,Default,,0,0,0,,puts("Hello, world!") +Dialogue: 0,0:08:03.85,0:08:06.41,Default,,0,0,0,,然后这个 puts 又是什么呢? +Dialogue: 0,0:08:06.64,0:08:08.62,Default,,0,0,0,,可以看到 puts 的 +Dialogue: 0,0:08:08.90,0:08:11.70,Default,,0,0,0,,它只是跳转到了某一个地址 +Dialogue: 0,0:08:11.99,0:08:14.15,Default,,0,0,0,,然后这个地址又是什么呢? +Dialogue: 0,0:08:14.96,0:08:18.53,Default,,0,0,0,,它其实是一个相对地址 +Dialogue: 0,0:08:18.84,0:08:19.98,Default,,0,0,0,,而这个地... +Dialogue: 0,0:08:20.23,0:08:23.55,Default,,0,0,0,,这个函数定义的位置其实是在 +Dialogue: 0,0:08:33.08,0:08:36.99,Default,,0,0,0,,可以看到他的定义位置其实是 +Dialogue: 0,0:08:38.40,0:08:40.12,Default,,0,0,0,,在这个文件里 +Dialogue: 0,0:08:40.41,0:08:40.96,Default,,0,0,0,,你看 +Dialogue: 0,0:08:41.94,0:08:45.17,Default,,0,0,0,,他其实是在这个文件里实现的 +Dialogue: 0,0:08:45.33,0:08:49.51,Default,,0,0,0,,那他们为什么能够相互之间调用呢? +Dialogue: 0,0:08:50.34,0:08:53.13,Default,,0,0,0,,就因为它在编译的时候 +Dialogue: 0,0:08:53.43,0:08:56.45,Default,,0,0,0,,它会自动链接上 libc +Dialogue: 0,0:08:56.72,0:09:01.20,Default,,0,0,0,,所以它可以调用到 libc 里的那个函数 +Dialogue: 0,0:09:01.89,0:09:04.86,Default,,0,0,0,,这就是动态链接库 +Dialogue: 0,0:09:09.96,0:09:13.20,Default,,0,0,0,,对呀,这里面是汇编语言 +Dialogue: 0,0:09:13.40,0:09:15.71,Default,,0,0,0,,这是一个把那个 +Dialogue: 0,0:09:17.15,0:09:20.12,Default,,0,0,0,,编译器不是生成机器码嘛 +Dialogue: 0,0:09:20.45,0:09:23.27,Default,,0,0,0,,然后 objdump 这个程序 +Dialogue: 0,0:09:23.29,0:09:28.31,Default,,0,0,0,,它可以把机器码反汇编成汇编语言 +Dialogue: 0,0:09:28.60,0:09:30.44,Default,,0,0,0,,就可以看得懂了 +Dialogue: 0,0:09:31.05,0:09:34.67,Default,,0,0,0,,less 是让它可以上下滚动 +Dialogue: 0,0:09:34.98,0:09:38.78,Default,,0,0,0,,不加 less 的我就难以滚动了 +Dialogue: 0,0:09:42.61,0:09:46.40,Default,,0,0,0,,我们刚才只用了一个 hello 文件 +Dialogue: 0,0:09:46.74,0:09:50.90,Default,,0,0,0,,但有时候我们是需要多个文件的 +Dialogue: 0,0:09:51.17,0:09:53.03,Default,,0,0,0,,这时候我们其实 +Dialogue: 0,0:09:55.54,0:10:02.91,Default,,0,0,0,,其实是可以根据 hello.cpp main.cpp a.out +Dialogue: 0,0:10:03.46,0:10:04.95,Default,,0,0,0,,也是可以的 +Dialogue: 0,0:10:05.95,0:10:09.81,Default,,0,0,0,,但是这样的话他就有一个问题 +Dialogue: 0,0:10:10.32,0:10:13.16,Default,,0,0,0,,比如我们改了一下 "Hello, world!" +Dialogue: 0,0:10:13.78,0:10:15.78,Default,,0,0,0,,把它变成 "Bello, world!" +Dialogue: 0,0:10:16.61,0:10:18.39,Default,,0,0,0,,他这时候去编(译)的话 +Dialogue: 0,0:10:18.66,0:10:21.25,Default,,0,0,0,,就得全部重新编译一遍 +Dialogue: 0,0:10:21.64,0:10:24.44,Default,,0,0,0,,他就浪费了时间,对吧? +Dialogue: 0,0:10:24.76,0:10:27.92,Default,,0,0,0,,所以说这种情况我们可以把 +Dialogue: 0,0:10:28.08,0:10:31.43,Default,,0,0,0,,先把 hello world 变成 hello.o +Dialogue: 0,0:10:34.46,0:10:37.18,Default,,0,0,0,,当然要加一个 -c 选项 +Dialogue: 0,0:10:37.42,0:10:40.43,Default,,0,0,0,,表示只是暂时编译成 .o 文件 +Dialogue: 0,0:10:40.63,0:10:43.82,Default,,0,0,0,,不是 a.out 的可执行文件 +Dialogue: 0,0:10:44.15,0:10:48.62,Default,,0,0,0,,这个 .o 呢,其实里面也是已经变成汇编了 +Dialogue: 0,0:10:51.04,0:10:53.61,Default,,0,0,0,,不过他不是可执行的 +Dialogue: 0,0:10:54.07,0:10:56.34,Default,,0,0,0,,你看如果我这样的话 +Dialogue: 0,0:10:56.73,0:10:58.22,Default,,0,0,0,,他就会报错 Dialogue: 0,0:10:59.11,0:11:09.60,Default,,0,0,0,,可以的,就是要用那个操作系统的int 80中断 Dialogue: 0,0:11:09.60,0:11:18.94,Default,,0,0,0,,即使lab c 里面这个这个实现打印,就是通过调用inter 80这个中断的 Dialogue: 0,0:11:18.94,0:11:38.32,Default,,0,0,0,,然后然后就是我们这样以后的话,然后这样以后就只需要把这两个一编译好的点O文件把它编译成 a.out 就行了