logo

只搜索本站

《21世纪C》翻译网站

第1章 了解如何才能使编译过程变得简单

本章主要内容

这一部分主要说明一个道理,C语言和Linux有不可分割的亲密关系,只有在Linux下C语言才能充分发挥出自己的威力。所以如何在Linux下配置,安装出一个能够编译C语言的环境就显得非常的必要了。同时它也介绍了你应该如何安装和配置那些必要的编写C语言需要用到的各种工具软件。

1.1 使用包管理器

问题: 如何在linux下安装软件?隐藏答案
答案:
  • 如果你有管理员权限,安装软件是一个很简单的事情。你可以从包管理器直接安装。具体的细节可以参考: Beginner Geek: How to Install Software on Linux
  • 如果你没有管理员的权限,你可以通过编译源代码的方式把软件安装到你指定到你的个人目录,一般的源代码包都可以通过 configure --prefix=LOCAL_PATH 来指定到n你本地的目录,具体可以参考: Compiling in $HOME
  • 一般情况下,我们不推荐直接下载可执行文件(二进制文件)的方式来安装和使用软件,因为通常可执行文件都依赖于一些特定版本的库文件才能运行,而你的linux系统下可能并没有哪些文件,不过如果你没有管理员权限,同时通过源代码安装又失败了,这个时候也可以下载一些预编译好的可执行文件来试试运气。
  • 对于deb文件,你也可以在没有管理员权限的情况下安装它。具体请参考intall .deb How to install program locally without sudo privileges?

问题: 什么是软件包管理工具?隐藏答案

答案:用于在linux上安装,更新和删除软件。这样你就不用通过重新编译源代码来安装某一个软件了。目前大部分的linux版本都有了自己的图形界面的软件包管理工具。 具体的细节可以参考: Installing softwares in linux


问题: 软件包名字中的版本号和机器架构号如何理解?隐藏答案

答案:版本号分为主版本号,次版本号和编译号,具体的细节可以参考: 什么是i386, i586, i686, noarch, x86_64

如何选择32位包还是64位包,取决于你的计算机CPU的位数,具体的可以参考:What are the differences between 32-bit and 64-bit, and which should I choose?


问题: 什么是Valgrind?隐藏答案

答案:用于检测内存泄露和越界的一个工具。 具体的细节可以参考: The Valgrind Quick Start Guide


1.2 在windows下编译C程序

坦白的说,我不认为Cygwin非常的必须和必要。即使你只有一台计算机并且已经安装了Windows,你完全可以做一个双系统的计算机,这并没有什么技术难度。这么做的好处在于你有两个纯粹的系统。即使你不想这样,你也可以在你的Windows上安装一个虚拟机VMware,然后再虚拟机中安装一个linux系统。一个纯粹的系统比一个四不像的Cygwin更可靠一些。


问题: 什么是POSIX?隐藏答案

答案:这是一个标准,它的全称是:Portable Operating System Interface。它的目的就是使得你的程序在遵守POSIX标准的操作系统之间移植变得相对容易。目前,UNIX,BSD,LINUX和MAC 都支持POSIX标准。

例如,它规定了一些C语言的接口(C API)标准,如open。也规定了一些目录结构(directory structure),如/temp。这样,如果你有下面的C语言程序: open(“/temp”, O_CREAT); 就可以在UNIX,BSD,LINUX和MAC上都可以编译和运行了。 具体的细节可以参考: What is POSIX


问题: 什么是BSD?隐藏答案

答案:BSD也是一种Unix-like的操作系统,它与UNIX不同的最大不同在于它是开放源代码的。与Linux不同,如果你在BSD上进行定制的修改,你可以保持源代码保密,但是在LINUX上进行的定制修改,你必须要把你的修改的源代码公开。 具体的细节可以参考: What’s the Difference Between Linux and BSD?


1.3 链接函数库的方式

这一部分需要了解三个最重要的问题:1)GCC在哪里去找头文件?2)GCC在哪里去链接库文件?3)GCC从哪里去加载一个动态库文件?

问题: GCC在哪里寻找头文件?隐藏答案

问题: GCC在哪里寻找库文件?隐藏答案

问题: GCC从哪里去加载一个动态库文件?隐藏答案

答案: 具体的细节可以参考: Linux动态库(.so)搜索路径


问题: 在script脚本中,$*代表什么?隐藏答案

答案:代表脚本执行的时候,后面接着那些参数。 具体的细节可以参考: Unix - Special Variables


问题: 默认执行动态链接还是静态链接?隐藏答案

答案: 默认执行动态链接,即首先查找*.so库,如果没有找到*.so库,那么就执行静态链接了。所以一般情况下,你不用特殊指定链接的方式。具体的细节可以参考: Does gcc link program with static or dynamic library by default?


问题: 如何决定动态或者静态链接?隐藏答案

答案: 具体的细节可以参考: g++ linker: force static linking if static library exists?


问题: LDADD=-Llibpath -Wl,-Rlibpath如何理解?隐藏答案

答案: 首先,你需要知道LDADD是一个makefile专用的变量,它并不是gcc编译器用的一个变量。具体的答案可以参考上一个问题。 Linux动态库(.so)搜索路径


问题: 如何生成静态库和动态库?隐藏答案

1.4 使用Makefile

当你在一个目录中生成了一个hello.c的文件的时候,你可以通过make hello来得到一个名字为hello的可执行程序。这个命令比起gcc要简单一些,所以我推荐你使用。为什么这个命令会工作?这是因为make本身的内部定义了很多的隐含变量和隐含的规则,具体的介绍可以参考下面的问题。

对于一个多文件的系统,做一个Makefile还是应该的。只需要包含4个变量。P:用来指定程序的名字,OBJECTS:用来指定.o的名字,CFLAGS和LDLIBS分别是编译和链接时的选项。再外加一个$(P) : $(OBJECTS) 一个依赖描述即可。

问题: makefile中如何设定变量的值?隐藏答案

答案:在一般的shell脚本中,当你设置变量的时候,你必须要加上单引号或者是双引号,同时等号的两边不能有空格。CFLAGS='Wall, -g, -O3" 具体的细节如下面的链接描述。 shell脚本中的反引号,单引号,双引号与反斜杠 但是如Makefile中,设置变量的时候不需要单引号和双引号,同时等号的两面也可以有空格。如: CFLAGS = Wall, -g, -O3


问题: make简单的中文教程?隐藏答案

问题: make有哪些隐含的变量和规则?隐藏答案

答案: 隐含的变量在下面这个链接中: Variables Used by Implicit Rules ,隐含的规则可以通过点击上面的网页中的一个链接来阅读


问题: 请给我一个通用的make模板?隐藏答案

答案: 模板可以参考下面的链接:这个模板可以应付一个中等规模的项目了。 A Simple Makefile Tutorial


1.5 以源文件的方式使用库

1.6 以源文件的方式使用库(即使你的系统管理员不想叫你这么做)

这两部分的内容在上面的如何在Linux下安装软件的时候都已经介绍过了。具体请参考上面的内容

1.7 通过here文档来编译C程序

我不认为通过here文档在命令行上输入C语言有什么特殊的意义。建立一个临时的文件,然后调用一个编译器编译它,这个成本几乎为零。而且你还可以充分使用你喜欢的编辑器的一些编辑特性。在实际的工程上,我也很少应用它,也许就像作者说的,它只是有趣!

如果你还是对它情有独钟,我推荐你学习并掌握go_c个alias是如何建立的,它整体上降低了here文档的难度。