Linux 上的“make 和 make install”软件

Linux 上的“make 和 make install”软件

我从事 Linux 工作已有一年了。有一件事困扰着我,那就是我不熟悉使用源代码安装新软件的过程(由于环境限制,我无法从网络安装它们)。

我经常被不同类型的错误所困扰,例如:

------------------------
libtool: install: error: relink `Magick++/lib/libMagick++.la' with the above command before installing it
------------------------

或者

------------------------
magick/.libs/libMagickCore.so: undefined reference to `gzseek64'
magick/.libs/libMagickCore.so: undefined reference to `gztell64'
------------------------

虽然我最终通过 Google 找到了解决方案,但我不知道它究竟为何有效。

有人能帮助我解决这种情况或者给我一些建议,告诉我如何在这种事情上改进自己吗?

我缺乏“配置”、“制作”、“64 位差异”、“共享库”方面的知识;有人能给我指明正确的方向并给我一些有用的书籍或文章吗?

答案1

好吧,首先要开始的两个地方是 GNU make 手册和 GNU autoconf 手册。http://www.gnu.org/software/make/manual/make.htmlhttp://www.gnu.org/software/autoconf/manual/autoconf.html您现在不需要了解所有内容,但它会让您了解幕后发生的事情。

基本上,当您配置程序时,会为您的系统生成一个 make 文件。如今,许多软件开发都是使用打包成所谓库的完成代码完成的。这样,程序员就不需要关注一些非常重要但同时与他们的程序无关的事情。以图形用户界面为例。在今天的程序中,它是必要之恶,因为我们目前没有更先进的东西。虽然许多程序都需要有 GUI,但对于编写程序的程序员来说,这并不是特别有趣。相反,他会想专注于它的主要功能。这就是经常使用 GUI 库的原因。

当你编译一个程序时,编译器需要知道在哪里找到程序正在使用的所有库。make 将使用 autoconf 配置的 makefile 来告诉编译器在哪里找到它们。Autoconf 将检测你的系统并适当地配置 makefile。

您可能还注意到,程序的源代码包含在多个文件中。这些文件通常是单独编译的。Make 还负责这些文件的编译顺序。编译完所有文件后,需要将它们链接在一起形成一个程序。链接器就是负责这个的。最后,您将获得可以调用的可执行文件。

另一件有趣的事情是,不需要手动调用编译器。Make 将自动调用它并使用适当的设置。

现在说说您遇到的错误:未定义引用错误是因为 autoconf 为您的系统配置了一个 makefile,但没有正确检测所有依赖项。您的程序需要先正确安装 zlib,然后才能进行编译。Autoconf 应该已经告诉您这一点,但似乎您启动了 make,而 make 启动的编译器找不到 zlib,因此产生了错误。

第一个错误是由于所谓的条件编译而产生的。基本上,你可以告诉 autoconf 你不想使用程序的某个部分。然后 autoconf 会修改 makefile,这样程序的某个部分就不会被编译。在我看来,在编译 Magick++ 时,一些选项被关闭了。它基本上是在告诉你,你需要打开它们。

稍微介绍一下共享库。一旦程序使用了一个库,它就可以用作链接的静态库,因此它是程序的一部分,或者用作实际上不是程序一部分的动态库。当您想要不依赖于任何其他内容的程序时,静态库是很好的选择,但它们会占用 RAM 空间,并且如果多个程序使用相同的库,则每个程序都必须将其加载到 RAM 中以供自己使用。动态库的情况略有不同。一旦程序启动,它会将库加载到 RAM 中并使用它。该库不是程序的一部分,因此需要单独安装。但是,如果多个程序使用相同的库,则只需将其加载到 RAM 中一次,所有程序都会使用相同的副本。这几乎总是与 GUI 库一起使用。

最后,由于您的计算机无法访问互联网,请做好遭受很多痛苦的准备。您永远不知道某个程序何时需要一些模糊的依赖关系,或者您安装的程序版本何时与新程序所需的版本不兼容。

相关内容