Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
116 changes: 83 additions & 33 deletions 01/01.ass
Original file line number Diff line number Diff line change
Expand Up @@ -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 节点仿真
Expand All @@ -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++ 的 <cstdio> 和 C 语言的 <stdio.h>
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 就行了
Expand Down