Linux下软件编译常见问题指南(编译过程)

本文章原载于我的博客 http://www.hupeiwei.com


在Linux下使用诸如apt、pacman和yum这样的软件管理工具安装软件比较简单,往往一条命令就足够了。但是,如果想安装一个旧版本软件进行测试与研究,或者是一个比较冷门的软件,就需要用户获取源代码从头进行编译。前一段时间我积累了许多这种经验,因此本篇文章从实用的角度描述编译时可能出现的问题及解决办法。

在自己开始编译源码前,首先要阅读软件给出的相关说明。它们往往在README或者INSTALL文件中,对软件所依赖的包、编译过程进行一些描述。

绝大多数软件源码的编译方式不过如下几种。

  1. 如果看到源码目录里有CMakeLists.txt,你可能需要在当前目录下建立一个build文件夹,然后在build里面执行cmake …(或者直接在CMakeLists.txt同级目录下执行cmake .);然后再执行make、sudo make install命令。

  2. 如果目录里面有configure,往往是执行configure,然后执行make和sudo make install。

  3. 如果有autogen.sh这样的文件,往往是执行autogen.sh,生成configure,然后再执行configure、make和sudo make install。

虽然总体上的编译方式不多,可能出现的问题却千奇百怪,下面为我结合实际经验总结出的问题及可能的解决方法。

问题1:在autogen.sh或者configure运行时提示缺少相关的库。

这些缺少的库提示往往以lib开头,比如libdbus。但是,直接使用apt安装libdbus是不行的,因为该库对应的软件包不一定就叫libdbus。因此,可以使用sudo apt-cache search libdbus进行搜索。所需安装的包往往是搜索结果中以dev结尾的包。其实,直接将相关提示复制到Google进行搜索也可以得知缺少的库。

有时,软件还对库的版本进行限制。比如我需要安装libdbus-1-dev的某个指定版本,可以使用sudo apt-cache policy libdbus-1-dev搜索备选版本。如果我想安装结果中的1.10.6-1ubuntu3.5版本,则可以使用sudo apt install libdbus-1-dev=1.10.6-1ubuntu3.5来安装。

如果备选版本中没有所需的版本,则可以去Google搜索、下载相应版本的库代码自行编译安装,或者是使用deb包进行安装。http://packages.debian.org/和http://packages.ubuntu.com/往往会提供所需的deb包。

问题2:没有configure文件。

如果源码目录中没有CMakeLists.txt,也没有autogen.sh、configure等常见的安装方式,不过存在configure.ac文件,可以在源码目录中执行以下指令,尝试生成configure。

aclocal
autoconf
autoheader(出现什么AC_CONFIG_HEADERS not found in configure.ac 可以忽略)
automake --add-missing(出现ltmain.sh not found,需要执行autoreconf -ivf)

问题3:undefined reference to ‘xxx’

这个问题会出现在make过程中,原因往往是默认的编译链接选项没有指定程序所需的库文件。将该错误提示进行搜索就可以得知缺少的是什么库、以及类似于export LDFLAGS="-lxx"的解决办法。注:export、unset、env是在shell中设置、取消、查看环境变量的常用命令。

问题4:提示文件内容错误

在编译过程中可能会提示Makefile某一行错误,或者源码某一行错误。这种问题比较棘手。出现的原因可能是源文件的确有错误,或者是代码太古老,一些写法现在的标准已经不支持。这种情况可以试一试通过注释掉一些代码来解决。

编译过程中出现的问题大部分还是因为编译环境引起的,尤其是缺少某些特定版本的库。实在解决不了,可以看看代码是哪一年写的,去http://old-releases.ubuntu.com/releases/下载当年的系统镜像进行尝试。通过docker或者虚拟机安装当年版本的系统进行环境配置,虽然麻烦,但是能够大幅提高成功率。总感觉在从源码编译软件的过程中遇到了很多问题,但在写这篇文章时反而写不出了。等后面出现了其它问题,再进行补充吧。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值