今天我们将深入探讨一些更高级的linux知识,具体来说是关于linux c程序的构建。
在日常的IT生活中,我们经常需要在源码环境下编译并安装软件。这也是开源软件的一个显著特点,而windows中的闭源软件通常不提供这种源码编译安装的方式。
程序的构建过程通常会经历以下几个阶段:
配置
配置阶段的目的是检查当前环境是否满足安装该软件的依赖关系。这可以被视为开源软件的一个缺点,因为开源软件的开发者通常使用其他开源库或工具来构建自己的程序。当我们想要运行他们的软件时,就需要检查我们的系统中是否已经安装了这些库或工具。
此外,配置阶段还包括设置一些安装必需的信息,如安装路径、需要安装的组件等。配置完成后,会生成一个Makefile文件,供下一步的make命令使用。
开源软件的开发者通常会提供一个configure文件,这个文件是通过autotool等工具生成的。关于configure文件的生成涉及到其他工具的使用和C/c++的知识,这里就不深入介绍了。
我们可以通过以下命令查看configure文件的可用选项:
./configure --help
或者我们可以配置程序的安装路径:
./configure --prefix=/usr/local/my
通常,我建议直接使用开发者默认的配置:
./configure
这样,程序会自动检测我们的系统环境,并列出我们缺少的文件。
我们以一个名为Shadow的软件为例进行演示。
从开发者的网站下载并解压这个软件后,进入目录,你会发现里面的结构大致如下。
按照上述步骤执行 ./configure 看看:
之后你会看到,configure文件开始检测系统环境是否满足安装需求。
通常,开发者会在其gitHub页面上列出需要安装的依赖包,我们可以根据我们的系统版本来查找这些依赖。
例如,这里我们可以在github上找到开发者提供的以下内容:
由于我们的系统是Fedora & RHEL类的,所以我们可以点击这里查看需要安装的依赖:
安装完依赖后,再次执行 ./configure 就不会出现错误了:
(我悄悄换了一台已经安装好依赖的机器~)
接下来,我们可以进行下一步,编译。
编译
顾名思义,编译就是将源文件进行编译链接生成可执行程序。
在执行完上述配置步骤后,目录中会出现一个Makefile文件。
你可能会说,我们之前已经看到了Makefile文件了。好的,我们来对比一下执行configure前后的区别。
以下是未执行configure之前的,确实有Makefile.am和Makefile.in两个文件,但它们并不是Makefile。
如果使用过automake的同学就会清楚这两个文件的作用(不过这种同学可能不会来看这种文章哈哈哈):
然后是执行完 ./configure 之后的:
已经多出了几个文件,最重要的是有了Makefile这个文件。
我们这里不讨论Makefile是如何编写的,这个比较复杂,一般需要写c语言超过一年以上的同学才能完全理解,而且对于用户来说,没必要知道程序的编译过程。
需要注意的是,Linux中的make命令会自动在当前目录下查找名为Makefile或makefile的文件来加载。
对于依赖较少且代码结构简单的代码,可以手动编写Makefile,这样可以省去第一步的配置工作。
但是对于依赖较多且代码结构复杂的项目,最好还是使用程序自动生成的Makefile。
这里简单介绍一下在Linux下编译文件。
假设我们有一个名为linux-test.c的C文件,如何编译它?
可以使用gcc命令:
gcc linux-test.c -o lt
这里的linux-test.c是我们编写的代码,-o之后接的是我们希望编译后程序的名字,这里是lt。
如果你编写的是C++代码,要使用g++命令。
好了,我们继续编译。一个文件我们可以用gcc,但是一堆文件的编译,我们就需要用到make了。
现在我们有了Makefile文件,我们就可以执行make了:
这样,程序就会自动链接和编译文件了。
最后等待一会儿,编译完成。
安装
在Linux中,安装就简单多了。如果你完成了上述几个步骤,只需将生成的可执行程序复制到你想要的地方即可。
但是我们有一个简单的命令:
make install
其实install是Makefile中的一个规则,我们可以打开Makefile来查看或编辑,但这是不建议的。
之后,程序就会自动复制到代码编写者指定的地方了。
这样,我们的程序就安装完成了。