1 00:00:00,220 --> 00:00:02,300 [Powered by Google Translate] [制作,铛] 2 00:00:02,300 --> 00:00:03,970 内特 - 哈迪森] [哈佛大学] 3 00:00:03,970 --> 00:00:07,290 [这是CS50] [CS50.TV] 4 00:00:07,290 --> 00:00:11,620 因此,让我们说,我已经写了一个小的C程序,打印出来的话“你好,世界!” 5 00:00:11,620 --> 00:00:14,550 我将它保存在一个文件名为hello.c。 6 00:00:14,550 --> 00:00:17,450 我怎么运行这个程序吗? 7 00:00:17,450 --> 00:00:20,860 如果我只是尝试运行的。c文件,这是行不通的。 8 00:00:20,860 --> 00:00:24,800 >> 电脑不一样,我打算把它当作一个C程序。 9 00:00:24,800 --> 00:00:28,530 事实证明,即使C代码看起来很神秘的在第一, 10 00:00:28,530 --> 00:00:32,470 它仍然不是足够低的水平,为计算机理解。 11 00:00:32,470 --> 00:00:36,800 之前,你可以在计算机上运行的C代码,您首先需要编译它, 12 00:00:36,800 --> 00:00:39,540 你的C代码转换成机器代码, 13 00:00:39,540 --> 00:00:44,380 - 正如它的名字所暗示的 - 是一个二进制的机器可以理解的格式。 14 00:00:44,380 --> 00:00:48,240 >> 做到这一点最简单的方法是只使用一个被称为“使命令。” 15 00:00:48,240 --> 00:00:52,690 Make是一个实用程序,用于编译源代码。 16 00:00:52,690 --> 00:00:58,170 这不是一个编译器本身,而是一个程序,组织编译器的调用 17 00:00:58,170 --> 00:01:01,660 源代码文件,这样的事情以正确的顺序被编译 18 00:01:01,660 --> 00:01:08,280 并以适当的方式,因为编译器标志可以得到一种复杂的,我们会看到。 19 00:01:08,280 --> 00:01:12,610 这是特别有用的,当你的工作有很多大的项目的源代码文件 20 00:01:12,610 --> 00:01:14,630 和许多不同的库。 21 00:01:14,630 --> 00:01:19,450 但它也是很好的使用它,当你只是用一个单一的文件。 22 00:01:19,450 --> 00:01:22,610 所以,让我们的这个“你好,世界!”程序,使用make编译。 23 00:01:22,610 --> 00:01:28,220 我的源代码文件的名称是hello.c的,所以我会键入make你好, 24 00:01:28,220 --> 00:01:31,680 将使用其默认设置来编译它。 25 00:01:31,680 --> 00:01:37,640 >> 如果一切顺利,我可以使用ls命令列出的目录中的所有文件, 26 00:01:37,640 --> 00:01:40,540 我应该看到一个新的文件名为“你好。” 27 00:01:40,540 --> 00:01:43,380 该文件被称为“可执行文件” 28 00:01:43,380 --> 00:01:47,160 它是二进制格式的,计算机可以理解的。 29 00:01:47,160 --> 00:01:51,370 如果我们把它打开,我们可以看到一些字符,我们可以理解, 30 00:01:51,370 --> 00:01:54,810 但在大多数情况下它只是一堆繁文缛节。 31 00:01:54,810 --> 00:02:00,920 不过,我可以运行此文件,看它打印出来“你好,世界!”一遍又一遍。 32 00:02:00,920 --> 00:02:03,420 >> 哦,兴奋​​! 33 00:02:03,420 --> 00:02:06,650 所以,让我们回到了一下,我们的make命令,看看究竟发生了什么 34 00:02:06,650 --> 00:02:09,580 ,以产生可执行文件。 35 00:02:09,580 --> 00:02:12,690 你可以看到,我跑时,它打印出这条线 36 00:02:12,690 --> 00:02:16,430  开始“铛”和结尾的“你好”。 37 00:02:16,430 --> 00:02:21,770 这是调用编译器 - 在这种情况下,一个叫“铛” 38 00:02:21,770 --> 00:02:27,720 一堆以我们的可执行文件的默认标志或选项。 39 00:02:27,720 --> 00:02:31,380 >> 铛是世界上有一些C编译器之一。 40 00:02:31,380 --> 00:02:34,050 你可能已经听说过或使用其他的, 41 00:02:34,050 --> 00:02:38,260 尤其是一个被称为“海湾合作委员会”,是特别常见的。 42 00:02:38,260 --> 00:02:42,160 我们选择使用铛CS50,因为我们认为它做了很好的工作 43 00:02:42,160 --> 00:02:45,220 提供有用的警告和错误消息 44 00:02:45,220 --> 00:02:48,480 ,因为使用它是非常类似于使用gcc, 45 00:02:48,480 --> 00:02:52,100 这样你就可以很容易地在两者之间切换。 46 00:02:52,100 --> 00:02:56,050 >> 时跑铛,它跑了一大堆的选项。 47 00:02:56,050 --> 00:02:59,360 然而,这是没有必要使用所有这些选项 48 00:02:59,360 --> 00:03:03,090  只是编译一个单一的C源代码文件。 49 00:03:03,090 --> 00:03:07,540 所有我需要做的是使用铛hello.c的。 50 00:03:07,540 --> 00:03:12,430 同样,如果一切顺利的话,这将产生一个可执行文件。 51 00:03:12,430 --> 00:03:19,670 但是,如果我尝试运行。/你好,我得到一个错误说,有没有这样的文件或目录。 52 00:03:19,670 --> 00:03:20,910 发生什么事了吗? 53 00:03:20,910 --> 00:03:25,030 铛的默认名称的可执行文件a.out格式, 54 00:03:25,030 --> 00:03:28,640 我们看到,如果我们用ls列出目录。 55 00:03:28,640 --> 00:03:34,210 这个文件中,我们可以运行,它也将打印出“你好,世界!”如预期。 56 00:03:34,210 --> 00:03:36,660 >> 如果我们想要重命名的可执行文件, 57 00:03:36,660 --> 00:03:38,900 这样做,我们可以使用move命令, 58 00:03:38,900 --> 00:03:43,040 但大多数的时候,我们只是想为我们铛做适当的命名。 59 00:03:43,040 --> 00:03:46,280 为此,我们可以使用-o标志。 60 00:03:46,280 --> 00:03:50,160 如果我运行铛hello.c的-O你好, 61 00:03:50,160 --> 00:03:53,100 然后我会得到一个名为“hello的可执行文件。” 62 00:03:53,100 --> 00:03:58,080 -o选项是超级常见的,所以我们期待看到和使用了很多。 63 00:03:58,080 --> 00:04:02,670 接下来的铿锵-W开始,你会看到很多的选项。 64 00:04:02,670 --> 00:04:06,800 这些选项控制什么样的警告铛让你对你的代码。 65 00:04:06,800 --> 00:04:12,060 例如,铛,可以提醒你,如果你声明一个变量,从来没有使用过。 66 00:04:12,060 --> 00:04:15,580 如果我把一个int变量x的hello.c 67 00:04:15,580 --> 00:04:22,520 然后编译铛-XX未使用的变量hello.c的邻你好, 68 00:04:22,520 --> 00:04:26,270 的铛警告我这个未使用的变量,在我的代码。 69 00:04:26,270 --> 00:04:28,800 >> 现在,有一吨不同类型的警告, 70 00:04:28,800 --> 00:04:32,920 这将是令人讨厌全部列出来,当您运行铛。 71 00:04:32,920 --> 00:04:38,570 相反,有一个快捷方式选项 - 墙把他们所有。 72 00:04:38,570 --> 00:04:42,020 我们在默认情况下,当你运行在家电, 73 00:04:42,020 --> 00:04:45,970 所以你会得到所有的警告铛可以给你对你的代码。 74 00:04:45,970 --> 00:04:50,620 在一般情况下,你的代码产生编译警告是不是一件好事, 75 00:04:50,620 --> 00:04:55,160 我们将期待你写的程序CS50警告。 76 00:04:55,160 --> 00:04:59,290 但是,正如你看到的,铛仍然会生成一个可执行文件 77 00:04:59,290 --> 00:05:02,940 即使是在编译过程中的警告。 78 00:05:02,940 --> 00:05:07,200 但是,我们可以强制铛停止编译并产生错误 79 00:05:07,200 --> 00:05:10,440 如果遇到在代码中的警告值得。 80 00:05:10,440 --> 00:05:14,000 我们这样做的-Werror选项。 81 00:05:14,000 --> 00:05:18,830 >> 现在,如果我编译我的hello.c文件与未使用的整型变量x, 82 00:05:18,830 --> 00:05:21,190 我不会得到一个可执行文件。 83 00:05:21,190 --> 00:05:23,880 现在,我不能忽视编译警告。 84 00:05:23,880 --> 00:05:25,900 我需要去修复我的代码。 85 00:05:25,900 --> 00:05:30,030 另外一个重要的选项是-ggdb。 86 00:05:30,030 --> 00:05:33,640 这使得特殊的调试信息的可执行文件, 87 00:05:33,640 --> 00:05:37,820 这样我就可以运行调试器,GDB,如果它崩溃。 88 00:05:37,820 --> 00:05:42,080 如果没有这个选项,我无法访问我的程序的信息gdb内的大部分, 89 00:05:42,080 --> 00:05:44,660 像变量和函数名, 90 00:05:44,660 --> 00:05:48,410 所以重要的是,包括ggdb了。 91 00:05:48,410 --> 00:05:53,120 当你运行在设备上,该选项也被默认包含的。 92 00:05:53,120 --> 00:05:56,820 >> 最后的选择,重要的是要知道的是-L, 93 00:05:56,820 --> 00:05:59,320 这是用来连接到你的代码库。 94 00:05:59,320 --> 00:06:04,190 例如,如果你要使用函数从CS50库,一样的GetString, 95 00:06:04,190 --> 00:06:09,200 你需要确保不仅你的#include库的头文件,CS50.h, 96 00:06:09,200 --> 00:06:11,350 在你的C源代码文件。 97 00:06:11,350 --> 00:06:15,250 而且您使用-lcs50当编译, 98 00:06:15,250 --> 00:06:19,370 使图书馆的实现是与你的程序。 99 00:06:19,370 --> 00:06:24,300 让我们改变的hello world程序提示用户输入用户名与GetString函数 100 00:06:24,300 --> 00:06:27,740 在我们的hello字符串,然后使用该名称。 101 00:06:27,740 --> 00:06:33,190 >> 现在,如果我们试图,编译此Ø使用lcs50程序, 102 00:06:33,190 --> 00:06:36,790 我们得到了一个错误的未定义引用的GetString。 103 00:06:36,790 --> 00:06:43,580 嗯哦!让我们添加的lcs50,现在一切都工作得很好。 104 00:06:43,580 --> 00:06:49,510 >> 有一个问题是,它在你的命令写lcs50有所作为。 105 00:06:49,510 --> 00:06:55,770 如果我把它写之前我写的hello.c,然后CS50库被加载和处理 106 00:06:55,770 --> 00:06:57,920 在我的源代码。 107 00:06:57,920 --> 00:07:01,430 所以,这是因为如果我不写lcs50所有。 108 00:07:01,430 --> 00:07:05,580 作为一个经验法则,一般情况下,你会希望把所有的-l选项 109 00:07:05,580 --> 00:07:08,070 在您的命令。 110 00:07:08,070 --> 00:07:10,490 所以,现在让我们把它们放在一起。 111 00:07:10,490 --> 00:07:20,000 铛-ggdb墙 - Werror hello.c中,lcs50-O的打招呼 - 112 00:07:20,000 --> 00:07:21,860 这是一个很大的东西。 113 00:07:21,860 --> 00:07:26,720 >> 这就是为什么品牌是有帮助的。所有这一切对你负责。 114 00:07:26,720 --> 00:07:30,410 >> 所以,现在你已经有了一个好主意,进入编译你的代码。 115 00:07:30,410 --> 00:07:33,470 我的名字是Nate哈迪森。这是CS50。 116 00:07:33,470 --> 00:07:36,470 [CS50.TV]